第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

為什么我的回調(diào)使用 redux 多次調(diào)用

為什么我的回調(diào)使用 redux 多次調(diào)用

德瑪西亞99 2023-05-11 14:05:10
我正在編寫一個react應用程序redux,避免使用react-redux,如果我們手動處理所有調(diào)度的事件,這在技術上是可行的。這是示例代碼。這index.html<!DOCTYPE html><html><head>  <script src="https://cdnjs.cloudflare.com/ajax/libs/redux/3.6.0/redux.min.js"></script>  <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.1/react.js"></script>  <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.1/react-dom.js"></script></head><body>  <div id="app"></div>  <script>  const appState= {    count: 0,  }  const reducer = (state, action) => {    if (typeof state === 'undefined') state = appState;    switch (action.type) {      case 'INCREMENT':        return {count: state.count+1}      case 'DECREMENT':        return {count: state.count-1}      default:        return state    }  }  var store = Redux.createStore(reducer);  const App = () => {    const [val, setVal] = React.useState(0);      handleClick = () => {      store.dispatch({type: 'INCREMENT'})    }      const unsubscribe = store.subscribe(() => {      const state = store.getState();      console.log("Listener is called")      setVal(state.count);    });      /* unsubscribe() */;      return (      <div>        <span>{val}</span>        <button onClick={handleClick}>Click</button>      </div>    );  }  ReactDOM.render(<App />, document.querySelector("#app"))  </script></body></html>在這里,如果我第一次單擊按鈕,它會將日志打印到控制臺一次,但是當我第二次單擊按鈕時,它會在日志上打印兩次語句,這表明來自訂閱的回調(diào)被調(diào)用了兩次,為什么會這樣我該如何防止呢?
查看完整描述

1 回答

?
守著星空守著你

TA貢獻1799條經(jīng)驗 獲得超8個贊

看起來您的組件在每個渲染周期都訂閱了商店,并且由于訂閱回調(diào)更新了組件狀態(tài),因此觸發(fā)了另一個渲染周期。


您可能只希望組件訂閱您的商店一次。


您可以使用效果訂閱一次以在更新時記錄狀態(tài)。使用效果清理功能取消訂閱。


const App = () => {

  const [val, setVal] = React.useState(0);


  handleClick = () => {

    store.dispatch({type: 'INCREMENT'})

  }


  useEffect(() => {

    const unsubscribe = store.subscribe(() => {

      const state = store.getState();

      console.log("Listener is called", state.count);

      setVal(state.count);

    });


    /* unsubscribe() */;

    return unsubscribe; // <-- return cleanup function

  }, []); // <-- empty dependency array to run once on mount


  return (

    <div>

      <span>{val}</span>

      <button onClick={handleClick}>Click</button>

    </div>

  );

}


查看完整回答
反對 回復 2023-05-11
  • 1 回答
  • 0 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號