Javascript 为什么useSelector中的选择器运行两次?
为什么useSelector中的选择器运行两次Javascript 为什么useSelector中的选择器运行两次?,javascript,reactjs,redux,react-hooks,render,Javascript,Reactjs,Redux,React Hooks,Render,为什么useSelector中的选择器运行两次 const选择器=(状态)=>{ log(“调用选择器”); 返回状态; }; 函数App(){ console.log(“渲染应用程序”); 常数计数=使用选择器(选择器); const dispatch=usedpatch(); 返回( 分派({type:“INCREMENT”}}>INCREMENT 分派({type:“减量”})}>减量 {count} ); } 下面是一个工作片段,显示每次装入子对象时都会运行两次选择器回调: co
const选择器=(状态)=>{
log(“调用选择器”);
返回状态;
};
函数App(){
console.log(“渲染应用程序”);
常数计数=使用选择器(选择器);
const dispatch=usedpatch();
返回(
分派({type:“INCREMENT”}}>INCREMENT
分派({type:“减量”})}>减量
{count}
);
}
下面是一个工作片段,显示每次装入子对象时都会运行两次选择器回调:
const{Provider,useDispatch,useSelector}=ReactRedux;
const{createStore,applyMiddleware,compose}=Redux;
函数计数(状态、操作){
console.log('reduction action:',action.type)
开关(动作类型){
案例“增量”:
返回{…state,count:state.count+1};
“减量”一案:
返回{…state,count:state.count-1};
违约:
返回状态;
}
}
const store=createStore(count,{count:0});
常量选择器=(状态)=>{
log(“调用选择器”,状态);
返回状态.count;
};
函数子(){
console.log(“呈现子项”);
常数计数=使用选择器(选择器);
const dispatch=usedpatch();
返回(
分派({type:“INCREMENT”}}>INCREMENT
分派({type:“减量”})}>减量
{count}
);
}
常量应用=()=>{
const[show,setShow]=React.useState(true);
返回(
设置显示(s=>!s)}>切换子项
{显示?:'none'}
)
}
const rootElement=document.getElementById(“根”);
ReactDOM.render(
,
根元素
);代码>
,因为它既在渲染阶段运行,也在调度操作之后运行。因此,第一个日志发生在呈现
时,第二个日志发生在单击按钮并发送更新存储状态的操作时
useSelector
在安装组件后第二次重新运行选择器,以检查在构建组件树时是否有由于调度操作而导致的任何其他更改。如果使用正确,这应该不会是问题。你问这个问题是出于好奇还是与这种行为有关的实际问题?(XY问题)@idmean出于好奇。我不知道为什么第一次加载应用程序时,选择器也会运行两次。因为。但毕竟,在渲染时,控制台会出现双重显示,所以我删除了示例中的包装更新-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>
);
}