亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

防止在功能道具更新時重新呈現

防止在功能道具更新時重新呈現

慕田峪7331174 2021-05-12 14:09:36
我有一個包含幾層子組件的表單。表單的狀態保持在最高級別,而我向下傳遞了作為更新最高級別的道具的函數。唯一的問題是,當表單變得很大(您可以動態添加問題)時,每個單個組件都會在其中一個更新時重新加載。這是我的代碼的簡化版本(或codesandbox:https : //codesandbox.io/s/636xwz3rr ):const App = () => {  return <Form />;}const initialForm = {  id: 1,  sections: [    {      ordinal: 1,      name: "Section Number One",      questions: [        { ordinal: 1, text: "Who?", response: "" },        { ordinal: 2, text: "What?", response: "" },        { ordinal: 3, text: "Where?", response: "" }      ]    },    {      ordinal: 2,      name: "Numero dos",      questions: [        { ordinal: 1, text: "Who?", response: "" },        { ordinal: 2, text: "What?", response: "" },        { ordinal: 3, text: "Where?", response: "" }      ]    }  ]};const Form = () => {  const [form, setForm] = useState(initialForm);  const updateSection = (idx, value) => {    const { sections } = form;    sections[idx] = value;    setForm({ ...form, sections });  };  return (    <>      {form.sections.map((section, idx) => (        <Section          key={section.ordinal}          section={section}          updateSection={value => updateSection(idx, value)}        />      ))}    </>  );};const Section = props => {  const { section, updateSection } = props;  const updateQuestion = (idx, value) => {    const { questions } = section;    questions[idx] = value;    updateSection({ ...section, questions });  };  console.log(`Rendered section "${section.name}"`);  return (    <>      <div style={{ fontSize: 18, fontWeight: "bold", margin: "24px 0" }}>        Section name:        <input          type="text"          value={section.name}          onChange={e => updateSection({ ...section, name: e.target.value })}        />          />        ))}      </div>    </>  );};我已經嘗試過使用useMemo和useCallback,但是我不知道如何使它工作。問題是傳遞函數以更新其父級。我無法弄清楚如何在每次表單更新時不對其進行更新。我無法在任何地方在線找到解決方案。也許我在尋找錯誤的東西。感謝您提供的任何幫助!
查看完整描述

3 回答

?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

通過使用復雜的表單解決此問題,我實現的技巧是onBlur={updateFormState}通過組件的prop傳遞給組件的輸入元素上觸發將表單數據從組件提升到父表單。

為了更新組件的輸入要素,我onChange={handleInput}使用了組件內部的狀態,然后當輸入(或組件作為一個整體,如果組件中有多個輸入字段)失去焦點時,通過提升功能將組件狀態傳遞給組件。

這有點hacky,并且由于某種原因可能是錯誤的,但是它在我的機器上可以工作。;-)


查看完整回答
反對 回復 2021-05-27
  • 3 回答
  • 0 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號