我正在查看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
答案 0 :(得分:0)
它缓存callback
本身以及您作为第二个参数传递的相关值。在任何时候它都拥有一个 callback
引用和一个依存值数组。
它需要依赖值来检查是否应该创建一个新的回调引用。