Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

为什么不能直接修改state,immutable的state和默认的有什么不同?state和props的使用场景分别是怎么的? #34

Open
guowei55555 opened this issue Jun 1, 2021 · 1 comment

Comments

@guowei55555
Copy link

No description provided.

@zyb970821
Copy link

1、为什么不能直接修改state

因为组件直接修改state,不会重新触发render函数,不会重新渲染页面,要通过setState方法传入参数去更改并渲染。

2、immutable的state和默认的有什么不同?

immutable是一种持久化数据。一旦被创建就不会被修改。修改immutable对象的时候返回新的immutable。但是原数据不会改变。

这个对象用来解决深拷贝的问题

浅拷贝和深拷贝的问题:

对于字符串类型,浅拷贝是对值的拷贝,对于对象来说,浅复制式对对象地址的复制,并没有开辟新的栈,深拷贝则是开辟新的栈,两个对象对应两个不同的地址。

接着上面的问题,因为深拷贝的性能问题,redux引入了immutable,因为深拷贝数据太庞大的话,系统需要的开销就很大,当你需要使用immutable数据的时候,只会拷贝你改变的节点,从而节省性能。

复制的思路如下图:
687474703a2f2f696d672e616c6963646e2e636f6d2f7470732f69322f5442317a7a695f4b5858585858637458465858627262384f5658582d3631332d3537352e676966

immutable中的API和数组、对象的遍历方法差不多;

之中的State和默认的区别在于,你用immutable设定的state跟默认的采用的赋值方式不同,如果你要通过setState进行修改,一个是对原来的state本身进行修改,而设定了immutable之后的state,会返回一个新的对象,你可以用一个变量对这个变量进行接受,没有修改的值是没有改变的,可以正常访问。

3、state和props使用场景

state多用于数据初始化,状态需要改变的场景,例如,你需要通过一个list展示state的数据;

props多用于父组件和子组件的通信,通过传参,子组件可以更改父组件中的状态,从而达到子组件跟父组件的简单通信。

也可以通过props对数据进行限制,利用propTypes进行设置,也可以设置默认值,通过defaultProps属性进行设置。

例子:

import PropTypes from 'prop-types';
const SubComponent=(props)=> {
  return (<h1>{props.name}</h1>)
}
SubComponent.defaultProps = {
  name: 'Rain_tdk'
};
SubComponent.propTypes = {
  name: PropTypes.string
};

@Dogtiti Dogtiti assigned Dogtiti and unassigned Dogtiti Jun 3, 2021
@Dogtiti Dogtiti removed the Cbayel label May 11, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants