我正在将数组“默认值”传递到我的面板组件中,然后尝试将状态挂钩“选定的选项”设置为等于它。出于某种原因,该钩子改为设置一个空数组。
组件:
const Panel = ({ title, inputs, datepicker, identifiers, apiBase, isins, defaults = [], notes = "" }) => {
const [expand, setExpand] = useState(false);
const [date, setDate] = useState(new Date());
const [selectedOption, setSelectedOption] = useState([...defaults]);
const [dataError, setDataError] = useState(false);
const [errorMsg, setErrorMsg] = useState('');
const [errorCheckLoading, setErrorCheckLoading] = useState(false);
const toggleExpand = () => {
setExpand(!expand);
console.log(defaults);
console.log(selectedOption);
};
仅出于测试目的,我在切换扩展功能中有几个控制台日志,因此我可以针对数据集测试传入的数据。
控制台日志的输出:
>(48) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…},
{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…},
{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
>[]
所以我知道数据可以正常工作,只是它没有在钩子中设置。
我还尝试了给钩子提供默认值和[defaults]的初始值。
现在画一个空白-有什么想法吗?
编辑:这是提供默认设置的父组件:
const Parent = () => {
const [all, setAll] = useState([]);
const [allLoadFailed, setAllLoadFailed] = useState(false);
const [defaults, setDefaults] = useState([]);
const [defaultsLoadFailed, setDefaultsLoadFailed] = useState(false);
useEffect(() => { loadData()}, []);
useEffect(() => { loadDefaultData()}, []);
const loadDefaultData = async () => {
try {
let defaultData = await GetDefaults();
setDefaults(defaultData.map(item => item = {value: item, label: item}));
} catch (_) {
setDefaultsLoadFailed(true);
}
};
const loadData = async () => {
try {
let iData = await GetAll();
let filteredIData = iData.filter(item => item);
setAll(filteredIData.map(item => item = {value: item, label: item}));
} catch (_) {
setAllLoadFailed(true);
}
};
return (
<Panel
title="Test"
isins={all}
defaults={defaults}
inputs
datepicker
identifiers
apiBase=""
notes="not yet complete"
key="2"
/>
);
答案 0 :(得分:2)
我在这里猜测defaults
是来自api调用的值?
之所以会发生这种情况,是因为在初始渲染defaults = []
和useState
的第一个参数中仅获取初始值,因此当default
在第二个渲染中更改为正确的数据时,{ {1}}已经具有useState
值。
您应该做的是在[]
更改并设置useEffect
时使用defaults
钩子。
selectedOption
答案 1 :(得分:1)
检查您的销毁结构,您正在将默认值设置为defaults = []
。它只会先渲染空数组,然后组件才能完成安装。您可能想使用useEffect
钩来检查新更新,然后在其中设置setSelectedOption(defaults)
,如下所示:
useEffect(() => {
setSelectedOption(defaults)
}, [defaults])