【React 进阶】props 和 state 的区别详解

27 篇文章 4 订阅
7 篇文章 4 订阅

时隔一年半之久再次重新学习 React,好多都还是原来的样子,这次我要重新开启 React 的大门,希望各位小伙伴可以一起讨论学习呦~

前言

今天我们开始第一个专题:React 中 关于 props 和 state。当然我们不是对 props 和 state 基本用法的介绍,而是尝试由浅入深的来解释 props 和 state 的本质和区别,并且归纳使用它们时的注意事项。

我们在开发应用时,必然是要与数据进行频繁交互的。React 的核心思想是组件化的思想,所有的页面会被切分成一些独立的、可复用的组件。
那么数据从何而来呢?React 的数据是自顶向下单向流动的,即从父组件到子组件中,组件的数据存储在 props 和 state 中。

UI = Component(props, state)

props 和 state 本质

props 是组件对外的接口,state 是组件对内的接口。 组件内可以引用其他组件,组件之间的引用形成了一个树状结构(组件树),如果下层组件需要使用上层组件的数据或方法,上层组件就可以通过下层组件的 props 属性进行传递,因此 props 是组件对外的接口。组件除了使用上层组件传递的数据外,自身也可能需要维护管理数据,这就是组件对内的接口 state。根据对外接口 props 和对内接口 state,组件计算出对应界面的UI。


props

组件从概念上看其实就是一个函数,它可以接受一个 props 作为输入值,所以可以把 props 理解为从外部传入组件内部的数据。由于 React 是单向数据流,所以 props 基本上也就是从父组件向子组件传递的数据。

1. 基础用法
<Component data="测试props"/>

现有两个组件:<ItemList/><Item/>

  1. <ItemList/>

    import Item from "./item";
    export default class ItemList extends React.Component{
      render(){
        return (
           <div>
             <Item data="我是props值"/>,
           </div>
        )
      }
    }
    
  2. <Item/>

    export default class Item extends React.Component{
      render(){
        return (
          <h1>{this.props.data}</h1>
        )
      }
    }
    

render 函数中可以看出,组件内部是使用 this.props 来获取传递到该组件的所有数据,它是一个对象,包含了所有你对这个组件的配置,现在只包含了一个 data 属性,所以通过 this.props.data 来获取即可。

这里只是对 props 的用法进行了简单的介绍,更详细、更高级的用法大家可以去官网学习哦~

2. 只读性

props 是组件的只读属性,组件内部不能直接修改 props,要想修改 props,只能在该组件的上层组件中修改。在组件状态上移的场景中,父组件正是通过子组件的 props,传递给子组件其所需要的状态。

props 经常被用作渲染组件和初始化状态,当一个组件被实例化之后,它的 props 是只读的,不可改变的。如果 props 在渲染过程中可以被改变,会导致这个组件显示的形态变得不可预测。只有通过父组件重新渲染的方式才可以把新的 props 传入组件中。

3. 默认参数

在组件使用过程中,我们最好为 props 中的参数设置一个 defaultProps,并且制定它的类型。比如这样:

Item.defaultProps = {
  item: 'Hello Props',
};

Item.propTypes = {
  item: PropTypes.string,
};

关于 propTypes 可以声明的其他类型请详见官网:使用 PropTypes 进行类型检查


state

state 的主要作用是用于组件保存、控制以及修改自己的状态,它只能在 constructor 中初始化,它是组件的私有属性,不可通过外部访问和修改,只能通过组件内部的 this.setState 来修改,修改 state 属性会导致组件的重新渲染。

1. 基础用法

在组件初始化的时候,通过 this.state 给组件设定一个初始的 state,在第一次 render 的时候就会用这个数据来渲染组件。

export default class ItemList extends React.Component{
  constructor(){
    super();
    this.state = {
      itemList:'好多数据',
    }
  }
  render(){
    return (
      {this.state.itemList}
    )
  }
}
2. 如何定义 State

我们既然要创建组件,那么就必然需要定义一个能代表一个组件UI呈现的完整状态集,也就是说:组件对应UI的任何改变,都可以从 state 的变化中反映出来;同时,state 还必须是代表一个组件UI呈现的最小状态集,即 state 中的所有状态都是用于反映组件UI的变化,没有任何多余的状态,也不需要通过其他状态计算而来的中间状态。

⚠️ 并不是组件中用到的所有变量都是组件的状态! 当存在多个组件共同依赖同一个状态时,一般的做法是状态上移,将这个状态放到这几个组件的公共父组件中。

3. 正确修改 State

1)首先,不能直接修改 State

state 不同于 props 的一点是:state 是可以被改变的。不过,不可以直接通过 this.state=xxx 的方式来修改,而需要通过 this.setState() 方法来修改 state

this.setState({title: 'React'});

⚠️ 通过 this.state=xx初始化 state,使用 this.setState修改stateconstructor唯一能够初始化的地方。

2)setState 可以接收多个参数

  • setState 接受一个对象或者函数作为第一个参数,只需要传入需要更新的部分即可,不需要传入整个对象。

    export default class ItemList extends React.Component{
      constructor(){
        super();
        this.state = {
          name: '八了个戒',
          age: 25,
        }
      }
      componentDidMount(){
        this.setState({age: 18})  
      }
    }
    

    在执行完 setState 之后的 state 应该是 {name: '八了个戒', age: 18}

  • setState 还可以接受第二个参数,它是一个函数,会在 setState 调用完成并且组件开始重新渲染时被调用,可以用来监听渲染是否完成。

    this.setState({
      name: '八戒'
    },()=>console.log('setState finished'))
    

3)State 的更新是异步的

调用 setState,组件的 state 并不会立即改变,setState 只是把要修改的状态放入一个队列中,React 会优化真正的执行时机,并且 React 会出于性能原因,可能会将多次 setState 的状态修改合并成一次状态修改。

所以不能依赖当前的 state,计算下个 state。当真正执行状态修改时,依赖的 this.state 并不能保证是最新的 state,因为 React 会把多次 state 的修改合并成一次,这时,this.state 还是等于这几次修改发生前的 state。另外需要注意的是,同样不能依赖当前的 props 计算下个 state,因为 props 的更新也是异步的。


总结

propsstate 都是普通的 JavaScript 对象。它们都是用来保存信息的,这些信息可以控制组件的渲染输出,而它们的几个重要的不同点就是:

  1. props 是传递给组件的(类似于函数的形参),而 state 是在组件内被组件自己管理的(类似于在一个函数内声明的变量)。
  2. props 是不可修改的,所有 React 组件都必须像纯函数一样保护它们的 props 不被更改。 由于 props 是传入的,并且它们不能更改,因此我们可以将任何仅使用 props 的 React 组件视为 pureComponent(纯组件),也就是说,在相同的输入下,它将始终呈现相同的输出。
  3. state 是在组件中创建的,一般在 constructor 中初始化 state
  4. state 是多变的、可以修改,每次 setState 都异步更新的。

希望以上内容可以帮助到大家。我也是重新开始学习 React,欢迎大家一起讨论学习,最后不要忘记一键三连哦~

各位 加油!

参考内容:

  1. react中props和state有什么区别?(https://juejin.cn/post/6844903978061266957)
  2. React中state和props分别是什么?(https://segmentfault.com/a/1190000011184076)
  3. React 深入系列3:Props 和 State(https://juejin.cn/post/6844903591845724167#heading-1)
  • 14
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: React中,propsstate是两种不同的数据类型。 propsproperties)是父组件传给子组件的数据,子组件只能读取这些数据,不能修改。 state(状态)是组件自身维护的数据,组件可以读取并修改这些数据。 简单来说,props是用来给组件传递参数,state是用来维护组件的状态。 ### 回答2: React 中的 propsstate 是两个非常重要的概念,它们有着不同的特点和作用。propsstate 的主要区别在于它们的来源、可变性和使用方式。 1. 来源 props 是组件之间传递数据的一种机制,是由父组件传递给子组件的。父组件可以通过 props 向子组件传递任意类型的数据,包括数字、字符串、对象、数组、甚至函数等。子组件不能通过 props 修改传递过来的数据,props 只读。 state 是组件内部自身管理的一种数据,每个组件都有自己的 state 状态。组件可以通过调用 setState 方法来修改自己的 state 数据。 2. 可变性 props 是只读的,是不可变的。它们被设计成只能由父组件传递给子组件,子组件不能修改 props。如果需要修改 props 中的值,只能在父组件中进行修改。 state 是可变的,它们被设计成可以由组件自身进行修改,组件内部调用 setState 方法来改变自己的状态。当修改 state 时,React 会自动重新渲染组件。 3. 使用方式 props 通常用于传递数据和回调函数,使不同组件之间可以进行通信和交互。父组件向子组件传递 props,子组件从 props 中获取数据进行渲染,同时通过回调函数进行数据的传递和事件的触发。 state 用于存储组件的状态和数据,可以更新组件的显示和行为。当组件的状态改变时,React 会自动重新渲染组件,并根据新的状态计算出新的渲染结果。 总之,propsstate 都是 React 中组件很重要的数据管理机制。它们各自的特点和使用方式也是不同的。props 主要用于组件之间的通信、数据传递和事件处理,state 则主要用于控制组件自身的状态和行为。需要根据实际情况和需求,选择合适的数据管理方式。 ### 回答3: React是一款非常强大的JavaScript库,被广泛用于基于组件的Web开发。在React开发中,propsstate是两个非常重要的概念,也是非常容易混淆的概念。 Props是组件之间传递数据的一种方式,通常被用于从父组件向子组件传递数据。Props是一个JavaScript对象,可以包含任何类型的数据,例如字符串、数组、对象等等。在组件内部,我们可以通过this.props来访问这些数据,并使用它们来渲染组件。 而StateReact组件中的另一个重要概念,表示组件内部的状态数据。在组件内部定义一个state对象,该对象内部包含了组件的状态数据。State是私有的,只能由组件本身进行修改,其他组件无法访问。当state数据发生变化时,React会自动重新渲染组件。 那么,propsstate有什么区别呢? 首先,props是外部数据,通常由父组件向子组件传递,而state是组件内部的状态数据,只能由组件内部进行修改。 其次,props是只读的,一旦被传递给子组件,就无法再被修改,而state是可以被修改的,并且当state发生变化时,React会自动重新渲染组件。 最后,props是使组件“可配置”的一种方式,允许我们根据不同的数据来渲染不同的组件。而state是使组件“可动态”的一种方式,允许我们根据组件内部的状态数据来动态更新组件。 在开发React组件时,我们通常会用props来传递外部数据,而state则用于存储组件内部的状态数据。这两种概念的合理应用,可以使组件更加灵活、易维护,并且更好地符合React的设计理念。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值