使用键来识别 React.js 中的嵌套组件
Using keys to identify nested components in React.js
当组件从一个上下文"移动"到另一个上下文时,是否可以阻止它调用其所有生命周期?
最初,我有一个组件列表,由 id 键控。这很有用,因为当我对列表重新排序时,组件不会重新调用所有生命周期方法,它们只会"移动"。
很明显,我的设计必须从 [Widget] 移动到 [Row],其中 Row = [Widget]。项目现在在行之间移动,但始终具有相同的 ID。无论如何,当组件移动到新上下文时,将调用所有(包括组件WillMount)生命周期方法。
是否可以在整个渲染上下文中全局标识组件以防止此行为?还是我应该追求其他设计?
[ ][ ][ ] <- rows, don't care
||||||| ||||||| ||||||| <- significant
^ <- this
[ ][ ][ ]
|||||| |||||||| |||||||
^ <- should be able to move
文档中详细介绍了协调算法:http://facebook.github.io/react/docs/reconciliation.html
根据我对阅读它的理解,您无法完成您想要的:
在当前的实现中,您可以表达这样一个事实:一个 子树已在其同级之间移动,但您无法分辨 它已经搬到了别的地方。算法将重新渲染完整 子树。
一个可能的解决方案是将 Widget 组件与渲染位置分开生成。例如:
const WidgetContainer = () => {
const widgetTree = useMemo(() => SOME_WIDGETS.reduce((tree, widget) => ({
...tree,
[widget.name]: <widget.Widget someProps={someProps} />,
}, {}), []);
return (
<Container>
<Row1>
{WIDGET_ROW1.map((widgetName) => widgetTree[widgetName])}
</Row1>
{/* etc... */}
</Container>
);
};
这意味着您的小部件将存储为预渲染的 JSX 片段,而不是每个周期都呈现。显然,您需要将任何适当的依赖项添加到 useMemo 调用中,这可能会消除任何好处,但假设widgetTree
依赖项中不存在更改的唯一状态,那么这应该会阻止调用任何生命周期方法。
值得注意的是,当 JSX 片段添加到 widgetTree
/从中删除 JSX 片段时,生命周期方法仍将调用。
相关文章:
- 在嵌套组件中使用 react 组件时模块中断
- 在 React 中嵌套组件,props 不会传递给子组件
- 反应:在嵌套组件上冒泡点击事件
- Angular 1.5 嵌套组件绑定父值
- 在 knockoutjs 中嵌套组件
- 您如何处理 Angular2 中嵌套组件的依赖关系
- 如何处理 React 嵌套组件循环依赖?(使用 es6 类)
- AngularJS通过嵌套组件向上传播更改
- 如何在 RivetsJS 中处理递归嵌套组件
- 了解嵌套组件绑定在 KnockoutJS 上的工作原理
- 聚合物.js嵌套组件中的数据绑定
- 如何以正确的方式嵌套组件
- 映射到嵌套组件的 Elm 效果
- Material-ui:如何在嵌套组件中停止单击事件的传播
- 使用键来识别 React.js 中的嵌套组件
- Angular2 嵌套组件: 错误: core_2.输入不是函数 加载 http://localhost:9080/ap
- 如何将全局状态数据处理到Redux中的深度嵌套组件中
- React dnd-不确定如何为相同类型的嵌套组件启用拖放
- React Router-在嵌套组件中安装组件
- Uikit.可嵌套组件-如何从移动的项目获取id