React快速上手(二)state和事件绑定

上一篇介绍了react基础的jsx语法和组件相关的内容,但更新整个页面只能重新调用ReactDOM.render方法,这一篇会谈一谈react中的另一个核心概念:state,以及如何绑定事件

state

通过class方式声明的组件,可以在一开始的constructor中声明一个state,state有点类似于vue中的data,用于存放一些初始数据,然后我们通过更新state中的值,则可以对应的更新dom树

class App extends React.Component {
		// 声明state则需要提供一个constructor构造函数
		// 该构造函数应始终以props作为参数,在其中super(props)来将props传递到父类的构造函数中
        constructor(props) {
          super(props);
          // 在内部添加一个state,写入初始数据
          this.state = {
            num:1
          };
        }
        render() {
          return (
            <div>
             {/* 通过this.state访问数据 */}
             <p>{this.state.num}</p>
            </div>
          );
        }
      }
      ReactDOM.render(<App />, document.getElementById("root"));

正确使用state
关于state要注意
1.不要直接修改 state,直接修改state不会重新渲染页面,唯一可以直接给state赋值的地方就是构造函数中。
正确修改state的方法是通过setState()方法,通过this.setState(key:value)来给state重新赋值,并重新渲染页面

2.state的更新可能会是异步的
这代表我们不能依靠this.state和this.props来获取准确的当前state,解决这个问题,你需要将setState的参数换成一个函数,这个函数用上一个 state 作为第一个参数,将此次更新被应用时的 props 做为第二个参数,返回一个键值对的对象来更新state

this.setState(function(state, props) {
  // 不要使用this.state和this.props!
  return {
    key:value
  };
});

事件绑定

react的事件绑定使用小驼峰式命名,需要传递一个函数而不是作为事件处理函数

<input type="button" onClick={handleClick} />
// 如果内部逻辑较为简单,可以直接将逻辑写在函数内部,但要注意写成函数形式
// 这样写会实质上绑定的是console.log的return值
<input type="button" onClick={console.log('点击了')} />
// 要写成函数形式
<input type="button" onClick={()=>{console.log('点击了')}} />

react中不能通过return false来阻止默认事件

<a href="#" onClick={()=>{return false}}>
  不能阻止跳转
</a>

function handleClick(e) {
  e.preventDefault();
}

<a href="#" onClick={handleClick}>
  可以阻止跳转
</a>

如果需要在回调中使用this,需要绑定操作,否则this会是undefined
在这里插入图片描述
这是react文档的示例,需要经过一个bind(this),未经过这一步的,内部读取的this是undefined
这种写法比较麻烦,通常会使用箭头函数来达到同样的效果,一种是在声明时使用箭头函数,一种是在绑定时使用箭头函数

 class Add extends React.Component {
        constructor(props) {
          super(props);
          this.state = {
            num: 1
          };
        }
        // 在绑定时候,通过 事件名 = ()=>{} 的方式来声明函数,这样this就会被绑定
        add1 = () => {
          this.setState((state,props)=>{
              return {num:state.num+1}
          });
        };
        add2 (){
          this.setState((state,props)=>{
            return {num:state.num+2}
          });
        };
        render() {
          return (
            <div>
              <p>{this.state.num}</p>
              <input type="button" value="+1" onClick={this.add1} />
              {/* 也可以在调用的时候使用箭头函数的形式来调用,也可以绑定this */}
              <input type="button" value="+2" onClick={()=>{this.add2()}} />
            </div>
          );
        }
      }

事件传参
在react中传参要注意不能像vue一样写在括号了,刚开始的时候用vue的方式,发现事件并没有被绑定,然后才意识到如果使用vue的方法,事件直接就调用了

// 错误的,这样事件直接就被调用了,绑定的是实质是delRow方法的返回值
<input type="button" value="删除该行" onClick={this.delRow(id)} />
// 通常使用箭头函数的方式传参
<input type="button" value="删除该行" onClick={()=>{this.delRow(id})} />

总结

以上就是关于react的state和事件绑定的介绍,下一部分会介绍react的列表渲染和条件渲染

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值