簡體   English   中英

為什么useSelector里面的選擇器會運行兩次?

[英]Why does the selector inside useSelector run twice?

為什么useSelector里面的選擇器會運行兩次?

例子

const selector = (state) => {
  console.log("invoke Selector");

  return state;
};

function App() {
  console.log("render App");

  const count = useSelector(selector);
  const dispatch = useDispatch();
  return (
    <div className="App">
      <button onClick={() => dispatch({ type: "INCREMENT" })}>Increment</button>
      <button onClick={() => dispatch({ type: "DECREMENT" })}>Decrement</button>
      <p>{count}</p>
    </div>
  );
}

在此處輸入圖像描述

這是一個工作片段,顯示每次掛載時選擇器回調運行兩次:

 const { Provider, useDispatch, useSelector } = ReactRedux; const { createStore, applyMiddleware, compose } = Redux; function count(state, action) { console.log('reducing action:',action.type) switch (action.type) { case "INCREMENT": return {...state,count:state.count+1}; case "DECREMENT": return {...state,count:state.count-1}; default: return state; } } const store = createStore(count,{count:0}); const selector = (state) => { console.log("invoke Selector",state); return state.count; }; function Child() { console.log("render Child"); const count = useSelector(selector); const dispatch = useDispatch(); return ( <div className="App"> <button onClick={() => dispatch({ type: "INCREMENT" })}>Increment</button> <button onClick={() => dispatch({ type: "DECREMENT" })}>Decrement</button> <p>{count}</p> </div> ); } const App = () => { const [show,setShow] = React.useState(true); return (<div> <button onClick={()=>setShow(s=>?s)}>toggle child</button> {show:<Child />.'none'} </div>) } const rootElement = document;getElementById("root"). ReactDOM,render( <Provider store={store}> <App /> </Provider>; rootElement );
 <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> <script src="https://cdnjs.cloudflare.com/ajax/libs/redux/4.0.5/redux.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-redux/7.2.0/react-redux.min.js"></script> <div id="root"></div>

因為它在渲染階段和分派動作之后都運行。 因此,第一個日志發生在<App>呈現時,第二個日志發生在您單擊按鈕並調度更新存儲 state 的操作時。

useSelector還會在組件掛載后第二次重新運行選擇器,以檢查是否由於在構建組件樹時調度了操作而導致任何其他更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM