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

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

反應子狀態沒有得到更新

反應子狀態沒有得到更新

陪伴而非守候 2022-12-02 17:05:59
我有一個使用掛鉤初始化狀態的父組件。我將鉤子的狀態和 setState 傳遞給子對象,但是每當我更新多個子對象的狀態時,它們都會更新不是最新狀態的狀態。重現問題:當您建立鏈接并寫入您的信息并單擊提交時,它會成功附加到父狀態。如果在那之后添加另一個,它也會成功附加到父狀態。但是當你返回并在第一個鏈接上按提交時,它會出于某種原因破壞第二個鏈接。請在我的 codesandbox 上試用?;旧衔蚁胍氖且粋€創建新表單的按鈕。在每種形式中,您都可以選擇一種社交媒體類型,如 fb、instagram、tiktok,還可以輸入一個文本字段。這些數據存儲在狀態中,最后當您單擊應用更改時,我希望它存儲在我的數據庫中,即 firestore。你能幫我解決這個問題嗎?這是一個代碼沙箱。https://codesandbox.io/s/blissful-fog-oz10p這是我的代碼:管理員.jsimport React, { useState } from 'react';import Button from '@material-ui/core/Button';import AddNewLink from './AddNewLink';const Admin = () => {  const [links, setLinks] = useState({});  const [newLink, setNewLink] = useState([]);  const updateLinks = (socialMedia, url) => {     setLinks({      ...links,      [socialMedia]: url    })  }  const linkData = {    links,    updateLinks,  }    const applyChanges = () => {    console.log(links);    // firebase.addLinksToUser(links);  }  return (    <>      {newLink ? newLink.map(child => child) : null}      <div className="container-sm">        <Button        type="submit"        fullWidth        variant="contained"        color="primary"        onClick={() => {          setNewLink([ ...newLink, <AddNewLink key={Math.random()} linkData={linkData} /> ])}        }      >        Add new social media      </Button>      <Button        type="submit"        fullWidth        variant="contained"        color="primary"        style={{marginTop: '50px'}}        onClick={() => applyChanges()}      >        Apply Changes      </Button>      <h3>{JSON.stringify(links, null, 4)}</h3>      </div>    </>  );}export default Admin;
查看完整描述

1 回答

?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

我所看到的是 AddNewLink 中的鏈接將是一個陳舊的關閉,但在你的問題中你永遠不會使用它。這是您的代碼“有效”,因為您沒有描述它應該做什么它總是“有效”


const { useState } = React;


const AddNewLink = (props) => {

  const [socialMedia, setSocialMedia] = useState('');

  const [url, setUrl] = useState('');

  const { updateLinks, links } = props.linkData;

  console.log('links is a stale closure:', links);


  const handleSubmit = () => {

    updateLinks(socialMedia, url);

  };


  return (

    <div>

      <select

        value={socialMedia}

        onChange={(e) => {

          setSocialMedia(e.target.value);

        }}

      >

        <option value="">select item</option>

        <option value={'facebook'}>Facebook</option>

        <option value={'instagram'}>Instagram</option>

        <option value={'tiktok'}>TikTok</option>

      </select>

      <input

        type="text"

        id="standard-basic"

        label="Enter link"

        style={{ width: '95%' }}

        onChange={(e) => {

          setUrl(e.target.value);

        }}

      />

      <button

        type="submit"

        variant="contained"

        color="primary"

        style={{ marginBottom: '30px' }}

        onClick={() => handleSubmit()}

      >

        Submit

      </button>

    </div>

  );

};


const Admin = () => {

  const [links, setLinks] = useState({});

  const [newLink, setNewLink] = useState([]);


  const updateLinks = (socialMedia, url) =>

    setLinks({

      ...links,

      [socialMedia]: url,

    });


  const linkData = {

    links,

    updateLinks,

  };


  const applyChanges = () => {

    console.log(links);

    // firebase.addLinksToUser(links);

  };


  return (

    <React.Fragment>

      {newLink ? newLink.map((child) => child) : null}

      <div className="container-sm">

        <button

          type="submit"

          variant="contained"

          color="primary"

          onClick={() => {

            setNewLink([

              ...newLink,

              <AddNewLink

                key={Math.random()}

                linkData={linkData}

              />,

            ]);

          }}

        >

          Add new social media

        </button>

        <button

          type="submit"

          variant="contained"

          color="primary"

          style={{ marginTop: '50px' }}

          onClick={() => applyChanges()}

        >

          Apply Changes

        </button>

        <h3>{JSON.stringify(links, null, 4)}</h3>

      </div>

    </React.Fragment>

  );

};


ReactDOM.render(<Admin />, document.getElementById('root'));

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>

<div id="root"></div>

將 jsx 置于本地狀態并不是一個好主意,而是將數據保存在狀態中并將其傳遞給每次渲染的組件。



查看完整回答
反對 回復 2022-12-02
  • 1 回答
  • 0 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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