Javascript 如何延迟传递道具直到setState()完成?
我有一个名为Javascript 如何延迟传递道具直到setState()完成?,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,我有一个名为renderLayers的函数,它遍历filterState中的每个对象,并复制选中的属性设置为true const [layers, setLayers] = useState([]); (...) const renderLayers = () => { const newLayers = []; filterState.map(filter => (filter.checked &&
renderLayers
的函数,它遍历filterState
中的每个对象,并复制选中的属性设置为true
const [layers, setLayers] = useState([]);
(...)
const renderLayers = () => {
const newLayers = [];
filterState.map(filter => (filter.checked &&
newLayers.push(filter.linkedTo)
));
setLayers(newLayers);
}
然后我有一个组件将层
数组作为道具。但是,我的代码在setLayers
完成它的工作之前通过了它
<Component layers={layers}/>
在这种情况下,如何让程序等待setLayers()
完成?如果我使用条件呈现,例如0&&layers}
,是否会出现layers
仍然具有先前的值并将其传递到setLayer()
之前的情况 听起来你想做这样的事情:
0?层:null}/>
如果渲染层
可能会产生空数组,并且您希望将该空数组传递给组件
,则可能需要将层
初始化为空
:
const[layers,setLayers]=useState(null)
// ...
返回
这样,当设置layers
prop时,它将为null
,直到使用不同的值调用setLayers
如果,如您所说,层
可以有一个您不想呈现的先前值,那么您现在在应用程序中有了额外的状态,用于确定是否应该向下传递层
。对我来说,这闻起来很像肮脏的跟踪,但一个简单的解决方案可能只是将层
切换为具有状态的对象(您不想在这里分离状态,因为多次调用setX可能会导致渲染不同步)
const[layers,setLayers]=useState({data:[],ready:false})
常量渲染层=()=>{
// ...
setLayers({data:[“example”],ready:true})
}
返回
您可以使用条件渲染:
{layers.length > 0 && <Component layers={layers} />}
{layers.length>0&&}
组件
将不会呈现,除非层中有内容
您不能要求程序本身“等待”,因为这并不能解决核心问题:应该向用户显示什么
您可以做的是在layers
为空的情况下传递一个默认值:
<Component layers={layers.length > 0 ? layers : /*Some default value*/}/>
如果layers
有一个以前的值,因此它不是空的,那么这种情况会不会导致与ready
属性中的值保持为true相同的问题?我无法更改组件内部的逻辑,因为它来自库。“但是,我的代码在setLayers完成其工作之前通过了它。”根据您对代码功能的描述,这似乎是不可能的。请提供一个更完整的例子。何时/何地/何时调用renderLayers
?“哪些层仍然具有以前的值并在setLayer()之前传递它”,这取决于组件的总体工作方式。请提供更多信息。
const Component = props => {
if props.layers && props.layers.lengh > 0 {
return <Stuff/>
} else {
return <Loading/>
}
}