【发布时间】:2017-05-20 04:52:27
【问题描述】:
我刚刚在我的一个无状态功能组件中设置默认值时遇到了一个关于 React 性能的问题。
这个组件有一个defaultProps,它定义了row: false,但我不喜欢它,因为defaultProps在文件的末尾,这实际上使它更难看到.因此,我们不知道默认属性。所以我直接把它移到了函数声明中,并使用 ES6 的默认参数值来分配它。
const FormField = ({
row = false,
...others,
}) => {
// logic...
};
但后来我们与一位同事争论这是不是一个好主意。因为这样做可能看起来微不足道,但也可能对性能产生很大影响,因为 react 不知道默认值。
我相信在这种情况下,这是微不足道的。因为它是布尔值而不是对象/数组,因此在协调期间不会被视为不同的值。
但是,现在让我们看一个更高级的用例:
const FormField = ({
input: { name, value, ...inputRest },
label = capitalize(name),
placeholder = label,
row = false,
meta: { touched, error, warning },
...others,
}) => {
// logic...
};
在这里,我将placeholder 的值基于label,它本身基于input.name。使用带有默认参数值的 ES6 解构使整个事情变得非常容易编写/理解,而且它的工作原理就像一个魅力。
但这是个好主意吗?如果没有,那你将如何正确地做到这一点?
【问题讨论】:
-
就我个人而言,
FormField中的参数列表对我来说太重了。如果它不是立即可读的,它会增加不必要的复杂性恕我直言。我的意思是,你必须解释它。也就是说,默认某些传入值是完全有效的,Redux 使用其initialState对象:redux.js.org/docs/basics/Reducers.html -
我同意它越来越重。绝对是我目前写的最复杂的,不过IMO已经够清楚了,感谢链接,我去看看!
-
酷,特别是他开始的部分“一个巧妙的技巧是使用 ES6 默认参数语法......”
-
是的。但这是针对减速器的,而不是针对组件的。这不是同一个生命周期。这对 reducer 非常有用,因为它只是初始值。我对组件的担心是因为 react 可能认为值发生了某种变化,因为它不知道初始值,因为它从未定义为 props,而是通过默认的 ES6 参数定义的。
-
但是无状态组件没有生命周期,这就是您的示例。
标签: performance reactjs ecmascript-6 destructuring