为什么不推荐使用变异风格?

IT技术 reactjs
2021-05-08 13:07:28

0.13 和 0.14 中的文档都警告说 mutating style 已被弃用,但没有提及原因

不推荐在渲染之间重用和改变样式对象

如果我想对基于 css 类的动画无法处理的元素执行状态相关的动画,我该怎么办?每次都克隆对象?

非常感谢新的react、帮助和建议

3个回答

您可以通过将以前的样式复制到新变量并复制以前的样式对象来解决此问题。

例子:

不允许

const {styleFromProps} = this.props;

const newStyle = styleFromProps['marginTop'] = '45px';

允许

const {styleFromProps} = this.props;

const newStyle = {...styleFromProps, marginTop: '45px'};

这样,您不会改变任何东西,而只是从前一个对象(即 styleFromProps)创建一个新对象

解决这个问题非常简单。

不好的方式

<div style={this.props.style} />

好办法

<div style={{ ...this.props.style }} />

查看测试用例/预期错误,您是正确的,应该克隆对象。

Warning: `div` was passed a style object that has previously been
mutated. Mutating `style` is deprecated. Consider cloning it
beforehand. Check the `render` of `App`. Previous style:
{border: "1px solid black"}. Mutated style:
{border: "1px solid black", position: "absolute"}.

https://github.com/facebook/react/blob/fc96f31fade8043856eb7bc34c56598c4a576110/src/renderers/dom/shared/测试/ReactDOMComponent-test.js#L128

我猜这类似于 props 的推理 - 它使您免于到处传递可变样式对象,并最终失去了 React 非常擅长帮助您进行推理的很多简单性。

The props object is now frozen, so mutating props after creating a component element is no longer supported. In most cases, React.cloneElement should be used instead. This change makes your components easier to reason about and enables the compiler optimizations mentioned above.