Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果依赖对象是数组,是否重新渲染?_Javascript_Reactjs - Fatal编程技术网

Javascript 如果依赖对象是数组,是否重新渲染?

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

我正在创建一个UseMoom,它需要基于
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.过滤器状态和字段名称状态。这样,它只会在需要时重新启动。