Reactjs 如果从react钩子中的多个源获取,如何防止重新渲染?

Reactjs 如果从react钩子中的多个源获取,如何防止重新渲染?,reactjs,react-hooks,Reactjs,React Hooks,我在react Native中使用了react挂钩。 我的问题是,useState的函数初始化状态,使其重新渲染。 所以如果我像下面这样设置状态 const[A,setA]=useState(false); const[B,setB]=useState(false); const[C,setA]=useState(false); // ... 常量testFunc=()=>{ 刚毛(真); 挫折(真实); 国家经贸委(真); } 已编辑 我认为例子是错误的。 这是另一个例子 const us

我在react Native中使用了
react挂钩。
我的问题是,
useState
的函数初始化状态,使其重新渲染。 所以如果我像下面这样设置状态

const[A,setA]=useState(false);
const[B,setB]=useState(false);
const[C,setA]=useState(false);
// ...
常量testFunc=()=>{
刚毛(真);
挫折(真实);
国家经贸委(真);
}

已编辑 我认为例子是错误的。 这是另一个例子

const useFetch(coords){
const[example,setExample]=useState([]
const[checker,setChecker]=useState(false);
常量fetchData=()=>{
fetch(`url+${coords.latitue}+${coords.longitude}`)。然后(){
setExample(res.data());
setChecker(真);
}
}
useffect(()=>{
fetchData();
},[coords])
返回示例;
}
const useLocation=()=>{
...
返回坐标;
}
常量应用=()=>{
const coords=useLocation();
const example=useFetch(coords);//示例未定义。
const[data,setData]=useState(示例);//数据未定义。
}

当我使用set函数时,它会导致多次重新渲染。 这是自然现象吗?
如果我不想进行此重新渲染,则不能多次使用set函数?

如果在基于React的事件外部触发状态更新,React不会批处理状态更新。这意味着,如果希望成批更新状态,则需要将其包装在事件句柄上,例如
onClick

如果您的本地组件状态是非平凡的和/或使用事件处理程序不是一个选项,我建议您使用
useReducer
,因为您可以在其中批处理状态更新

这似乎是正常的反应行为。如果在类组件中多次调用setState(),其工作方式与此完全相同

如果从基于React的事件(如按钮单击或输入更改)中触发,React当前将批处理状态更新。如果在React事件处理程序(如setTimeout())外部触发更新,则不会对其进行批处理

我认为有长期计划总是批量事件,但不确定细节

资料来源:

你不能用直截了当的方式做这件事。我将为您推荐两种解决方案

解决方案1:将状态合并到一个对象中

const [value, setValue] = useState({A: false, B: false, C: false});

// ...

const testFunc = () => {
    setValue({A: true, B: true, C: true});
}
解决方案2:另一个解决方案是
useReducer

const [state, setState] = useReducer(
  (state, newState) => ({...state, ...newState}),
  {A: false, B: false, C: false}
);

// ...

const testFunc = () => {
    setState({A: true, B: true, C: true});
}
在这里,我实现了您的另一个示例:


希望这对你有帮助

如其他答案中所述,如果在基于React的事件外部触发React,React不会批处理状态更新(例如,在
然后
中),解决方案之一是将状态合并到一个对象中,并一次性调用setState。但如果您想保持状态分离,解决方案是使用
ReactDOM.unstable\u batchedUpdate
如下:

const fetchData=()=>{
fetch(`url+${coords.latitue}+${coords.longitude}`)。然后(()=>{
ReactDOM.unstable_batchedUpdate(()=>{
setExample(res.data());
setChecker(真);
});
});
}

丹·阿布拉莫夫推荐的

在哪里取?“你是说什么都答应?”奥马尔谢谢你的回答。我的例子不足以解释我的问题。因此,我添加了一个示例来向您展示。如果coords经常更改,那么是的。它将始终使用更新的lat,long重新渲染。@JosephD。谢谢你的回复。您的意思是如果我从多个来源获取数据,那么当我使用
useState
setFunction
时,
view
将被多次渲染?谢谢您的回复。我的例子不足以解释我的问题。所以,我添加了一个示例来向您展示。不幸的是,它没有。我认为我的例子不足以解释我的问题。我想按顺序设置状态,因为每个自定义挂钩都是相关的。例如,
B custom hook
需要来自
A custom hook
的数据来获取数据。这应该对你有用。我添加了另一个例子来解释我的问题。对于我的第二个示例,这是否有效?只需提及:使用解构,它看起来就像具有多个
useState
const[{A,B,C},setState]=useReducer(…)
这并不总是正确的。尝试在onClick事件中提取数据,并使用
useState
的set函数,这将导致重新呈现所使用的任意多个set函数。例如:
const res=await-fetch('your-api');setFlag(真);setResult(true);setOpen(真)此代码将导致3次重新渲染。