React中的state&props

React.js 的 state 就是用来存储这种可变化的状态的。

1.setState 接受对象参数

  • setState 方法,它接受一个对象或者函数作为参数。
  • setState 方法由父类 Component 所提供。当我们调用这个函数的时候,React.js 会更新组件的状态 state ,并且重新调用 render 方法,然后再把 render 方法所渲染的最新的内容显示到页面上。

    handleClickOnLikeButton () {
    this.setState({
    isLiked: !this.state.isLiked
    })
    }
  • 当你调用 setState 的时候,React.js 并不会马上修改 state。而是把这个对象放到一个更新队列里面,稍后才会从队列当中把新的状态提取出来合并到 state 当中,然后再触发组件更新。

    handleClickOnLikeButton () {
    console.log(this.state.isLiked) //false
    this.setState({
    isLiked: !this.state.isLiked
    })
    console.log(this.state.isLiked) //false
    }
  • 你会发现两次打印的都是 false,即使我们中间已经 setState 过一次了。这并不是什么 bug,只是 React.js 的 setState 把你的传进来的状态缓存起来,稍后才会帮你更新到 state 上,所以你获取到的还是原来的 isLiked。
  • so,如果你想在 setState 之后使用新的 state 来做后续运算就做不到了。
    so,这里就自然地引出了 setState 的第二种使用方式,可以接受一个函数作为参数。

2.setState 接受函数参数

  • 以下是对象作为参数

      handleClickOnLikeButton () {
        this.setState({ count: 0 }) // => this.state.count 还是 undefined
        this.setState({ count: this.state.count + 1}) // => undefined + 1 = NaN
        this.setState({ count: this.state.count + 2}) // => NaN + 2 = NaN
      }

    上面的代码的运行结果并不能达到我们的预期,我们希望 count 运行结果是 3 ,可是最后得到的是 NaN。但是这种后续操作依赖前一个 setState 的结果的情况并不罕见

  • 以下是函数作为参数

     handleClickOnLikeButton () {
        this.setState((prevState) => {
          return { count: 0 }
        })
        this.setState((prevState) => {
          return { count: prevState.count + 1 } // 上一个 setState 的返回是 count 为 0,当前返回 1
        })
        this.setState((prevState) => {
          return { count: prevState.count + 2 } // 上一个 setState 的返回是 count 为 1,当前返回 3
        })
        // 最后的结果是 this.state.count 为 3
      }

    一个函数作为参数。React.js 会把上一个 setState 的结果传入这个函数,你就可以使用该结果进行运算、操作,然后返回一个对象作为更新 state 的对象:
    这样就可以达到上述的利用上一次 setState 结果进行运算的效果

3. props

怎么把 props 传进去呢?就像你在用普通的 HTML 标签的属性一样,可以把参数放在表示组件的标签上,组件内部就可以通过 this.props 来访问到这些配置参数了

class Index extends Component {
  render () {
    return (
      <div>
        <LikeButton likedText='已赞' unlikedText='赞' />
      </div>
    )
  }
}

比如这里的 likedTextunlikedText ,是写在 LikeButton这个组件的标签里的

你不能改变一个组件被渲染的时候传进来的 props
eg:

//  这是一个反例
 handleClickOnLikeButton () {
    this.props.likedText = '取消'
    this.setState({
      isLiked: !this.state.isLiked
    })
  }

我们尝试在用户点击按钮的时候改变 this.props.likedText ,然后你会看到控制台报错啦

【总结】
* state 是让组件控制自己的状态,
* props 是让外部对组件自己进行配置。

附一个优秀的例子

import React, { Component} from 'react';
import ReactDOM from 'react-dom';

class LikeButton extends Component {
    constructor () {
        super();
        this.state = {isLiked: false}
    }

    handleClickOnLikeButton () {
        this.setState({
            isLiked: !this.state.isLiked
        })
    }

    render () {
        return (
            <button onClick={this.handleClickOnLikeButton.bind(this)} >
                {this.state.isLiked ? this.props.likedText : this.props.unlikedText}
            </button>
        )
    }
}


class Index extends Component {
    constructor () {
       super()
       this.state = {
          likedText: '已赞初始的lalaaaaaaaaaaaaaaaaaaaa',
          unlikedText: '赞初始的laaaaaaaaaaaaaaaaaaa'
        }
    }

    handleClickOnChange () {
        this.setState({
          likedText: '取消改变后wwwwwwwwwwww',
          unlikedText: '点赞改变后wwwwwwwwwwwwww'
        })
    }

    render () {
        return (
            <div>
                <LikeButton
                    likedText={this.state.likedText}
                    unlikedText={this.state.unlikedText} />
                <div>
                  <button onClick={this.handleClickOnChange.bind(this)}>
                    修改 wordings
                  </button>
                </div>
          </div>
        )
    }
}

ReactDOM.render(
    <div><Index /></div>,
    document.getElementById("app")
);  

可以看到,只点击第一个按钮的话,在初始的state里切换,点击后一个按钮后在改变后的state里切换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Reactpropsstate是两种不同的数据类型。 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、付费专栏及课程。

余额充值