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

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

從表單響應更新狀態

從表單響應更新狀態

狐的傳說 2022-11-11 14:21:55
我正在嘗試從表單中獲取值并將其存儲在狀態中。每次我遵循指南時,都會出現以下錯誤(更不用說指南都是類風格的反應):“渲染沒有返回任何內容。這通常意味著缺少返回語句?;蛘?,不渲染任何內容,返回 null。”組件呈現,我什至可以將一個虛擬值傳遞給 step.generalInfo.name,它會顯示在組件上。但是,只要我按一個鍵進入輸入,繁榮錯誤。我認為錯誤出現在兩個地方之一 - 我的 handleChange() 或我試圖更新狀態的方式,因為我試圖在另一個對象內的對象中獲取值。我可能沒有正確解構或支撐鉆孔。請幫忙!謝謝!App() 呈現如下形式:function Form() {  const [step, setStep] = useState({    stage: 1,    generalInfo: {      name: "",      batchSize: "",      batchType: "",      batchNumber: "",      ibu: "",      srm: "",      abv: "",      origionalGravity: "",      finalGravity: "",      brewingDate: "",      dateSecondary: "",      dateBottling: "",    },    ingredients: ["", "", ""],    brewingNotes: "",    hopsNotes: "",    yeastNotes: "",    fermentationNotes: "",...更多狀態和下一頁/上一頁功能...  const handleChange = (e) => {    console.log(e);    console.log(e.target.name);    console.log(e.target.value);    setStep({ [e.target.name]: e.target.value });    console.log(step);  };  const handleSubmit = (e) => {    e.preventDefault();  };  switch (step.stage) {    case 1:      return (        <StepOne          step={step}          next={next}          prev={prev}          handleChange={handleChange}          setStep={setStep}        />      );  }}export default Form;StepOne 組件如下:function StepOne({ step, next, prev, handleChange, setStep }) {  const {    name,    batchSize,    batchType,    batchNumber,    ibu,    srm,    abv,    origionalGravity,    finalGravity,    brewingDate,    dateSecondary,    dateBottling,  } = step.generalInfo;  return (    <div className="form-container">      <h1>General Info</h1>      <form>        <div className="label-group">          <label>Name:</label>          <input type="text" name="name" onChange={handleChange} />        </div>        <button onClick={next}>Next</button>      </form>    </div>  );}export default StepOne;
查看完整描述

3 回答

?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

修復 handleChange 是關鍵!


  const handleChange = (e) => {

    e.persist();

    console.log(e);

    console.log(e.target.name);

    console.log(e.target.value);

    setStep((state) => ({

      ...state,

      generalInfo: { ...state.generalInfo, [e.target.name]: e.target.value },

    }));

    console.log(step);

  };


查看完整回答
反對 回復 2022-11-11
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

您的功能handleChange不正確,它刪除了step除當前更改的字段之外的所有狀態字段。如果它使用來自狀態的數據,這可能會導致另一個組件崩潰step


它應該是


const handleChange = (e) => {

    console.log(e);

    console.log(e.target.name);

    console.log(e.target.value);

    setStep({ ...step, [e.target.name]: e.target.value }); <= HERE

    console.log(step);

};


查看完整回答
反對 回復 2022-11-11
?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

我相信它在您的 handleChange 方法中的 setStep

setStep({ [e.target.name]: e.target.value });

useState 不會以與 this.setState 相同的方式合并,因此階段被覆蓋并且您的 switch 語句不會返回渲染。

相反,您需要傳遞一個函數來迭代狀態

setStep((state) => ({...state, generalInfo: {...state.generalInfo, [e.target.name]: e.target.value}}))

但是考慮到嵌套的數量,e.target.name 的位置很難找到;你會從使用 useReducer 而不是 useState 中受益匪淺。


查看完整回答
反對 回復 2022-11-11
  • 3 回答
  • 0 關注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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