Javascript 如果依赖对象是数组,是否重新渲染?
我正在创建一个UseMoom,它需要基于Javascript 如果依赖对象是数组,是否重新渲染?,javascript,reactjs,Javascript,Reactjs,我正在创建一个UseMoom,它需要基于currentSettings.Filters,这是一个数组,重新呈现 let[currentSettings,setSettings]=useState(查询设置); 让设置_Sales=usemo(()=>{ 设s=Object.assign({},currentSettings) s、 XFieldName=“ProductName”; s、 YFieldName=“销售”; 返回s; },[currentSettings.Filters]) my
currentSettings.Filters
,这是一个数组,重新呈现
let[currentSettings,setSettings]=useState(查询设置);
让设置_Sales=usemo(()=>{
设s=Object.assign({},currentSettings)
s、 XFieldName=“ProductName”;
s、 YFieldName=“销售”;
返回s;
},[currentSettings.Filters])
my object QuerySettings,currentSettings
的初始值如下所示:
{
"XFieldName": "ProductName",
"YFieldName": "Counts",
"Filters": {
"ProductGroup": [],
"ProductName": ["ProductA", "ProductB"],
}
}
常量查询设置={
“XFieldName”:“ProductName”,
“YFieldName”:“计数”,
“过滤器”:{
“产品组”:[],
“产品名称”:[],
}
}
现在,当用户为要筛选的产品选择一个表单时,即
函数句柄更改(e、字段名、设置){
let settings_temp={…settings};
设置\u临时过滤器[fieldName]=数组源(e.currentTarget.selectedOptions,(v)=>v.value)
设置设置(设置温度)
}
我的currentSettings
如下所示:
{
"XFieldName": "ProductName",
"YFieldName": "Counts",
"Filters": {
"ProductGroup": [],
"ProductName": ["ProductA", "ProductB"],
}
}
但是我的useMemo部分不会被重新渲染。是因为我的过滤器是一个数组,而React无法检测数组中的更改吗?另外,请随意重构我的代码,我肯定在努力学习如何更好地编写代码
谢谢
编辑:感谢评论和解决方案。请注意,它取决于
currentSettings.Filters
(而不是currentSettings
)的原因是,如果currentSettings中的其他对象(即XFieldName)发生更改,我们希望避免重新渲染。换句话说,当且仅当currentSettings.Filters
更改时重新渲染。React不知道数据已更新,因此不会重新渲染。你可以试着用备忘录代替。通过适当的依赖关系,它将让React知道状态已更改
const defaultSettings = {
XFieldName: 'ProductName',
YFieldName: 'Counts',
Filters: {
ProductGroup: [],
ProductName: [],
},
};
const [currentSettings, setSettings] = useState(defaultSettings);
const defineFilters = useCallback(
(newSettings) => {
setSettings((currentSettings) => ({
...currentSettings,
...newSettings,
}));
},
[setSettings]
);
function handleChange(e, fieldName, settings) {
//settings_temp.Filters[fieldName] = Array.from(e.currentTarget.selectedOptions, (v)=> v.value) // don't know what this does
defineFilters(settings); // assuming your settings is in {xFieldName:'', YFieldName: ''} format
}
作为依赖项的数组/对象通常会导致这种情况。有一些软件包使用JSON进行深度比较。stringify(anArray)是一种可能的解决方法,但并不总是一个好主意。如果你在网上搜索“react useeffect dependency object array”之类的东西,你会得到多种技术。
[currentSettings]
的依赖关系不起作用吗?谢谢你的解决方案。如果我正确理解逻辑,更改XFieldName
和YFieldName
也会导致重新渲染(由于依赖于[setSettings])?我想微妙的一点是,我们只能在过滤器更改时重新渲染,而不能在XFieldName和YFieldName更改时重新渲染?是的,如果您只传递defineFilters({filters:{new filters}),那么当前可以这样做。如果更新任何值,它将重新渲染。为了防止这种情况,您应该只将发生更改的状态分组在一起。如果需要独立于过滤器修改x&y,则应将其状态分开。i、 e.过滤器状态和字段名称状态。这样,它只会在需要时重新启动。