React状态,props和state的对比和各自的使用

这篇博客详细介绍了React组件的状态(props和state)及其区别。重点讲解了如何使用state来更新组件状态,包括初始化state、获取和修改state的方法。同时,文章还探讨了事件处理,包括事件绑定、事件中的this问题及其解决方案。此外,文中还阐述了受控和非受控组件的概念,并给出了使用state获取和更新文本框及单选框值的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

React状态

所有组件都会产生state对象

props:只能获取里面的值,不能修改,就算修改了也没用

state:获取和改变值

一:组件状态更新

1.使用ref获取节点,并获取节点的内容
  • 创建ref对象

    this.xxx = React.createRef();
    
  • 获取ref节点

    this.xxx.current
    

实例:

 class Addcount extends React.Component{
        //构造函数
        constructor(){
            super();
            this.input = React.createRef();
        }
      //获取文本框里面的值
        hanleInput = ()=>{          
              console.log(this.input.current.value);
        }
        render(){
            return <div>
                <div>
                    {/*当给文本框一个初始值value之后,(受空组件),点击文本框输入值不能输入了*/}
                    <input type="text" ref={this.input} value={this.state.value} onInput={this.handleValue}/>
                    <input type="button" value="增获取加"  onClick={this.hanleInput}/>
                </div>
                </div>
        }
    }

    ReactDOM.render(<Addcount />,document.getElementById("root"))
2.使用state对象
  • 初始化state

     constructor(){
         super();  //一般构造方法都是先调用父类的构造函数,不然this不能用,super的意思是调用父类的构造函数
         this.state = {
         count:0,
         value:"",
         gender:"female"
         }
     }
    
  • 获取state

    <p>{this.state.count}</p>
    
  • 设置state

    this.setState({
          count:this.state.count + 1          
     })
    

二:props和state对比

相同点:二者都是组件内部提供的对象

props:

  1. 用于组件之间传递数据
  2. 通过自定义属性或标签之间的内容传递
  3. 单向传递
  4. 可以手动设置,但手动设置的话不会更新组件状态,但是通过父组件传值过来更改的话,就会更新组件状态

state:

  1. 每个组件都可以初始化state对象
  2. state本身不能传递,传递只能利用props,但是值可以传递
  3. 可以设值,对象的组件状态会更新
  4. 设值方法必须是setState,而不是直接使用this.state

三:事件处理

  1. 在HTML中组件通过绑定事件处理方法来处理相应事件

    绑定的属性名前一定要加on,并且使用驼峰命名法

  2. 非HTMl组件不能处理事件,但是可以通过props传递

    可以是字符串,函数,对象

事件中的this

ES6的类中,事件处理方法的this为undefined

解决方法

  1. 在构造函数中将当前对象绑定给方法中的this

    this.hanleCount= this.handleCount.bind(this)
    
  2. 似乎用箭头函数定义方法

    handleCount=(e)=>{...}
    
  3. 在绑定事件时使用bind方法

    onClick={this.handleCount.bind(this)}
    
  4. 在绑定事件时使用箭头函数

    onClick={e=>this.handleCount(e)}
    

四:受控和非受控组件

  1. 文本框设置了value属性

  2. 单选或多选设置了checked属性

  3. 如何让受控组件可更改

    • 使用state设置值

    • 绑定onChange事件

    • 在事件处理方法中获取组件的值并更改state

      <input type="text" value={this.state.value}
      	onChange={(e)=>{this.setState({value:e.target.value})}}
      >
      

五:state

1.使用之间必须得初始化(在构造函数里面)

2.绑定事件

3.获取this.state

4.修改,必须在setState里面的修改this.setState({count:this.state.count+1})

setState是一个异步方法,因为这个操作不仅仅只是改值,还要进行DOM操作

操作步骤

ref相当于是给他一个标识,后面就通过这个标识来获取它,但是不能修改它,不推荐使用

1.state来增加数值

onClick

1.绑定

 render(){
     return <div>
         <lable>计数器:{this.state.count}</lable>
         <input type="button" value="增加"  onClick={this.hanleCount}/>
          </div>  
     </div>
 }

2.初始化(在构造函数中)

 constructor(){
     super();  //一般构造方法都是先调用父类的构造函数,不然this不能用,super的意思是调用父类的构造函数
     this.state = {
         count:0
     }
 }

3.函数修改

 //函数(要使用箭头函数,不然this无法获取)
hanleCount = ()=>{
    this.setState({
        count:this.state.count + 1
    });
    console.log(this.state.count);
}
2.state来获取文本框的值

onInput()

1.给文本框和点击事件绑定

 <div>
 {/*当给文本框一个初始值value之后,(受空组件),点击文本框输入值不能输入了*/}
     <input type="text" ref={this.input} value={this.state.value} onInput={this.handleValue}/>
     <input type="button" value="增获取加"  onClick={this.hanleInput}/>
 </div>

2.初始化文本框的值

 constructor(){
     super();  //一般构造方法都是先调用父类的构造函数,不然this不能用,super的意思是调用父类的构造函数
     this.input = React.createRef();
     this.state = {
     count:0,
     value:""
     }
 }

3.改变文本框的值或获取文本框的值

//获取文本框里面的值
hanleInput = ()=>{  
    //获取的值还是state里面的值
	console.log(this.state.value);
}
//设置文本框的值
handleValue = (e)=>{
    this.setState({
    value:e.target.value
})
}
3.state获取单选框的值

onChange

1.绑定

  <lable>性别:</lable>
  <input type="radio" value="male" name="gender" checked={this.state.gender=="male" ? true :false} onChange={this.hanleGender}/>
  <lable></lable>
  <input type="radio" value="female"  name="gender" checked={this.state.gender=="female" ? true :false} onChange={this.hanleGender}/>
  <lable></lable>

2.初始化

 this.state = {
                count:0,
                value:"",
                gender:"female"
            }

3.修改,赋值

  //获取性别
  hanleGender = (e)=>{
  this.setState({
  gender:e.target.value
  })
  // console.log("e23456",this.state.gender);
  }

4.获取值

 hanleInput = ()=>{          
 	console.log(this.state.value,this.state.gender);
 }

终:代码示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>计数器</title>
</head>
<body>
    <div id="root">
        <!-- <input type="password" placeholder=""> -->
    </div>
    <script src="./js/react.development.js"></script>
    <script src="./js/react-dom.development.js"></script>    
    <script src="./js/babel.min.js"></script>
    <script type="text/babel">

    class Addcount extends React.Component{
        //构造函数
        constructor(){
            super();  //一般构造方法都是先调用父类的构造函数,不然this不能用,super的意思是调用父类的构造函数
            this.input = React.createRef();
            this.state = {
                count:0,
                value:"",
                gender:"female"
            }
        }
        //函数(要使用箭头函数,不然this无法获取)
        hanleCount = ()=>{
            this.setState({
                count:this.state.count + 1
            });
            // console.log(this.state.count);
        }
        //获取文本框里面的值
        hanleInput = ()=>{          
            console.log(this.state.value,this.state.gender);
            // console.log(this.input.current.value);
        }
        //设置文本框的值
        handleValue = (e)=>{
            this.setState({
                value:e.target.value,                
            })
            // console.log(e.target.value,this.state.gender);
        }

        //获取性别
        hanleGender = (e)=>{
            this.setState({
                gender:e.target.value
            })
            // console.log("e23456",this.state.gender);
        }
        render(){
            return <div>
                <div>
                    {/*当给文本框一个初始值value之后,(受空组件),点击文本框输入值不能输入了*/}
                    <input type="text" ref={this.input} value={this.state.value} onInput={this.handleValue}/>
                    <input type="button" value="增获取加"  onClick={this.hanleInput}/>
                </div>
                <div>
                    <lable>计数器:{this.state.count}</lable>
                    <input type="button" value="增加"  onClick={this.hanleCount}/>
                </div>       
                <div>
                    <lable>性别:</lable>
                    <input type="radio" value="male" name="gender" checked={this.state.gender=="male" ? true :false} onChange={this.hanleGender}/>
                    <lable></lable>
                    <input type="radio" value="female"  name="gender" checked={this.state.gender=="female" ? true :false} onChange={this.hanleGender}/>
                    <lable></lable>
                    

                </div>           

                </div>
        }
    }

    ReactDOM.render(<Addcount />,document.getElementById("root"))

    </script>
</body>
</html>
<think>嗯,用户问的是Reactpropsstate区别,这个我得先回忆一下React的基本概念。首先,propsstate都是React组件的数据来源,但它们的用途用法应该不同。 用户可能刚接触React,对这两个概念容易混淆。他们可能是在写组件的时候遇到了问题,比如数据传递或者状态管理的问题。需要明确两者各自的职责,以及何时使用哪一种。 首先,props是父组件传递给子组件的,应该是只读的。子组件不能直接修改props,只能通过父组件传来的回调函数来间接改变父组件状态。而state组件内部自己管理的,可以通过setState来修改,进而触发重新渲染。 接下来要比较它们的可变性。state是可变的,而props不可变。不过这里要注意,虽然props不可变,但父组件可以传递不同的props给子组件,导致子组件重新渲染。 然后,作用范围。state组件私有的,只能在组件内部访问修改。props则是从外部传入,组件内部只能读取。如果子组件需要组件通信,通常通过props传递回调函数。 生命周期方面,props更新会触发组件的重新渲染,比如componentWillReceiveProps这样的生命周期方法(不过在React新版本中可能被废弃了)。state更新也会触发重新渲染,但通过setState来管理,可能是异步的。 还有默认值的问题,props可以通过defaultProps设置默认值,而state通常在构造函数里初始化。 可能需要举一些例子,比如父组件传递props给子组件,子组件显示这个props。而state的例子,比如一个按钮点击后改变状态,触发UI更新。 另外,用户可能会混淆何时使用propsstate。比如,如果数据需要由父组件控制,就用props;如果数据由组件自己维护,就用state。 还有,函数组件组件中的使用差异。函数组件通过useState使用state,而props仍然是作为参数传入。不过用户的问题可能主要针对类组件,但最好也提一下函数组件的情况。 需要确保回答结构清晰,分点说明,可能用对比的方式列出区别,帮助用户一目了然。同时避免使用专业术语过多,用简单的中文解释,让新手也能理解。 可能还需要提醒用户常见的错误,比如直接修改state而不使用setState,或者试图修改props导致错误。这些实际开发中的问题能帮助用户加深理解。 最后总结一下,props是外部传入的不可变数据,用于组件间通信;state是内部管理的可变数据,控制组件自身状态。两者的正确使用React组件设计的关键。</think>React中`props``state`的核心区别可通过以下对比理解: --- ### 一、定义区别 1. **Props** - 父组件向子组件传递数据的通道(单向数据流) - **不可变**:子组件不能直接修改接收到的`props` - 示例:`<ChildComponent title="Hello" />`中的`title`是`props` 2. **State** - 组件内部管理的私有数据(类似组件的“记忆”) - **可变**:通过`setState()`方法修改 - 示例:`this.state = { count: 0 }` --- ### 二、核心差异对比表 | **特性** | Props | State | |-------------------|--------------------------------|--------------------------------| | 数据来源 | 外部传入 | 组件内部创建 | | 可变性 | 只读 | 可修改 | | 更新触发渲染 | 父组件更新时 | `setState()`调用时 | | 作用域 | 跨组件传递 | 仅限当前组件 | | 默认值 | 通过`defaultProps`设置 | 构造函数中初始化 | --- ### 三、使用场景 1. **何时用Props** - 需要接收父组件/外部数据时(如配置参数) - 需要向子组件传递回调函数时(如`onClick={handleClick}`) ```jsx function Button(props) { return <button onClick={props.onClick}>{props.text}</button>; } ``` 2. **何时用State** - 需要管理组件内部状态时(如表单输入、计数器) - 需要根据用户交互动态更新UI时 ```jsx class Counter extends React.Component { state = { count: 0 }; increment = () => this.setState({ count: this.state.count + 1 }); render() { return <button onClick={this.increment}>{this.state.count}</button>; } } ``` --- ### 四、关键注意事项 1. **Props的不可变性** 直接修改`props`会报错(如`this.props.title = "New"` ❌),需要通过父组件更新 2. **State的异步更新** `setState()`是异步操作,连续修改需用函数形式: ```js this.setState((prevState) => ({ count: prevState.count + 1 })); ``` 3. **Props驱动State** 可通过`componentDidUpdate`实现`props`变化时更新`state`(需谨慎避免死循环) --- ### 五、可视化关系 ``` 父组件 │ ▼ 传递props组件 → 内部维护state │ ▲ └──────────┘(通过setState更新) ``` 正确理解这两个概念是构建可维护React应用的基础。简单记忆: **「Props组件间的通信协议,State组件的自我管理」**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值