useCallback和useMemo react hook的缓存大小是多少,为什么?

时间:2019-08-30 14:53:31

标签: reactjs react-hooks usecallback

我正在查看React源code,尤其是private void GenerateRETest() { DataTable rI = new DataTable(); rI.Columns.Add("sID", typeof(int)); rI.Columns.Add("sn", typeof(string)); rI.Columns.Add("RE", typeof(string)); rI.Rows.Add(25, "Apex 1", "RE 1"); rI.Rows.Add(50, "Apex 2", "RE 1"); rI.Rows.Add(10, "Apex 3", "RE 1"); rI.Rows.Add(21, "Apex 4", "RE 1"); rI.Rows.Add(251, "Apex 11", "RE 11"); rI.Rows.Add(501, "Apex 21", "RE 11"); rI.Rows.Add(101, "Apex 31", "RE 11"); rI.Rows.Add(211, "Apex 41", "RE 11"); rI.Rows.Add(215, "Apex 12", "RE 12"); rI.Rows.Add(510, "Apex 22", "RE 12"); rI.Rows.Add(110, "Apex 32", "RE 12"); rI.Rows.Add(211, "Apex 42", "RE 12"); var columnNames = dt.AsEnumerable().GroupBy((sn) => sn.Field<string>("RE")) .Select((group) => new { RE = group.Key, DataRowList = group.OrderBy((dataRow) => dataRow.Field<string>("sn")).ToList() }).OrderBy(x => x.RE).ToList(); foreach (var row in columnNames) { foreach (var dataRow in row.DataRowList) { StringBuilder sb = new StringBuilder(); sb.AppendLine(string.Join(",", columnNames)); IEnumerable<string> fields = dataRow.ItemArray.Select(field => string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\"")); sb.AppendLine(string.Join(",", fields)); } string fileName = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)) + "\\" + row + "display.csv"; File.WriteAllText(fileName, sb.ToString()); } } 的实现。据我了解,useCallback的缓存大小为1。在useCallback中,我们将mountCallback初始化为一个数组,其中第一个元素为hook.memoizedState-callback的第一个参数。在useCallback中,如果依存关系没有变化,则返回updateCallback数组的第一个元素。由于hook.memoizedState的引用未更改,因此不会重新渲染。相反,如果依赖关系发生了变化,并且我们将callback数组的第一个元素设置为hook.memoizedState的{​​{1}}参数,那么callback的引用将发生变化(因为函数对象参数始终具有一个新值),因此触发重新渲染。

因此updateCallback中的缓存基于callback的引用。我的理解正确吗?

useCallback

1 个答案:

答案 0 :(得分:0)

它缓存callback本身以及您作为第二个参数传递的相关值。在任何时候它都拥有一个 callback引用和一个依存值数组。

它需要依赖值来检查是否应该创建一个新的回调引用。