React文档中说:React非常灵活,但它有一条严格的规则:所有React组件在其道具方面都必须像纯函数一样工作
为什么呢?
我猜如果你直接改变props的值,组件不会重新渲染,这就是为什么我们必须使用setState。但我仍然不明白这背后的原因。为什么组件在道具方面必须像纯功能一样?
文档
医生说
所有React组件在其道具方面必须像纯函数一样工作。当然,应用程序UI是动态的,并且随着时间的推移而变化。在下一节中,我们将介绍“国家”的新概念。状态允许React组件在不违反此规则的情况下,随时间改变其输出,以响应用户操作、网络响应和其他任何操作。
React组件的重要概念是:组件应该只管理自己的状态,而不应该管理自己的道具。
事实上,一个组件的道具具体来说是“另一个组件(父组件)的状态”。所以道具必须由其组件所有者管理。这就是为什么所有的React组件在它们的道具方面都必须像纯函数一样运行(而不是直接变异它们的道具)。
我给大家看一个简单的例子:
class ParentComponent extends Component {
constructor(props) {
super(props);
this.state = {
p1: {a:1, b:2},
}
render() {
return <ChildComponent p1={this.state.p1} />
}
}
在ChildComponent中,如果你想改变传递的prop p1(p1是一个带有他自己的ref的对象)(例如。在ChildComponent中,你写:p1. a=3
),所以很明显,“p1-父母组件状态的属性”也是变异的。但是在这种情况下父母组件不能重新渲染,因为您没有触发父母组件中的动作setState()
。因此,它会为不稳定的React应用程序生成许多不受控制的错误。
我希望现在你能理解为什么React会说:
严格的规则是:所有React组件都必须像纯函数一样使用它们的道具(不要直接改变它们的道具)。
奖励:为了正确更改(变异)道具,你必须在ChildComponent中使用回调fnc道具。现在,它非常尊重React Component的概念。
class ParentComponent extends Component {
constructor(props) {
super(props);
this.state = {
p1: {a:1, b:2},
}
this.changeP1 = () => {
this.setState({p1: {a:3, b:4}});
}
render() {
return <ChildComponent p1={this.state.p1} changeP1={this.changeP1} />
}
}
本文向大家介绍为什么说React中的props是只读的?相关面试题,主要包含被问及为什么说React中的props是只读的?时的应答技巧和注意事项,需要的朋友参考一下 react官方文档中说道,组件无论是使用函数声明还是通过class声明,都绝不能修改自身的props,props 作为组件对外通信的一个接口,为了保证组件像纯函数一样没有响应的副作用,所有的组件都必须像纯函数一样保护它们的props
我一直在阅读React的快速启动文档; 为什么React道具是只读的?
问题内容: 我一直在阅读React的快速入门文档。 无论您将组件声明为函数还是类,都不得修改其自身的道具 这是一个“纯”函数,因为它不尝试更改其输入,并且对于相同的输入始终返回相同的结果: 这是“不纯”函数,因为它更改了自己的输入:https : //codesandbox.io/s/9z38xv4x7r 为什么React道具是只读的? 问题答案: 组件应管理自己的状态,但不应管理自己的道具。本质
在react中,您可以设置进入组件的道具的道具类型。对于我的一个道具,我希望值为null或一行JSX。React文档没有涵盖JSX应该使用的propType。 在测试时,我发现它在使用对象或元素的propTypes时不会抛出错误。当使用另一个符号(如符号)时,我会得到一个错误,表示它是一个对象。如果它是一个对象,当它是一个元素时,它肯定会抱怨。 JSX的正确类型是什么?
在React-Typescript初学者示例“创建组件”的“创建组件”部分中,Typescript中有一个基本的React组件: 我是打字新手。似乎Typescript使用接口道具来执行道具类型检查(类似于Proptypes npm包所做的)。因此,问题是: 如果我已经在使用这种TypeScript接口语法do to props类型检查,我还需要在同一个组件中使用像这样的Proptype包吗?
我试图理解React的高阶组件结构,但是所有的参考资料都假设您已经理解了在编写:BaseComponent{…this.props}{…this.state}时,spread操作符在高阶组件中的作用。如果组件已经作为道具传入,为什么有必要像这样展开道具?