美文网首页
react 视频总结

react 视频总结

作者: 哈哈哈哈哈啊啊啊 | 来源:发表于2020-05-12 16:15 被阅读0次

    一、 react 事件绑定

    如果传递一个函数名给一个变量,之后通过函数名()的方式进行调用,在方法内部如果使用this则this的指向会丢失
    在JSX中传递的事件不是一个字符串,而是一个函数(如:onClick={this.handleClick}),此时onClick即是中间变量,所以处理函数中的this指向会丢失。解决这个问题就是给调用函数时bind(this),从而使得无论事件处理函数如何传递,this指向都是当前实例化对象。

    事件绑定方式

    • constructor 中直接绑定(推荐使用)
      this.closeASbtn = this.closeASbtn.bind(this);
    • 函数生命方式
      //此时this指向是当前实例对象
      handleAdd = ()=> {
      console.log(this)
      this.setState({
      count:5
      })
      }
    • 在JSX中绑定,每次点击都会绑定一次
      <button onClick={this.handleClick.bind(this)}>有bind点击一下</button>

    事件对象

    vue

    • vue 的事件对象是原生的
    • 事件被挂载到当前元素
    • 和DOM事件一样

    react

    • react 的事件对象是syntheticEvent 是组合对象,模拟出来DOM事件所有能力
    • event.nativeEvent 是原生对象
    • 所有的事件挂载到document上
    • 和DOM事件不一样,和Vue事件也不一样

    react 自定义传参

    <button onClick={this.handleClick.bind(this,id,name)}>有bind点击一下</button>
    接收时最后一个参数是event对象

    二、 受控组件和非受控组件

    受控组件

    • 每当表单的状态发生变化时,都会被写入组件的state中
    • 在受控组件中,组件渲染出的状态与他的value或checked prop 相对应
    • react受控组件更新state的流程
      <1> 通过在初始state中设置表单的默认值
      <2> 每当表单的值发生变化时,调用onChange事件处理器
      <3> 事件处理器通过合成对象e拿到改变后的状态,并更新应用的state
      <4> SetState触发视图的重新渲染,完成表单组件值的更新
    • 使用受控组件需要为每一个组件绑定一个change事件,并且定义一个事件处理器来同步表单值和组件的状态,某些情况可以使用一个事件处理器来处理多个表单域
    • 在受控组件上指定 value 的 prop 可以防止用户更改输入

    非受控组件

    • 如果一个组件没有value prop就可以称为非受控组件
    • 非受控组件是一种反模式,他的值不受state和props控制
    • 通常需要为其添加ref prop来访问渲染后的DOM元素

    三、父子组件通讯

    状态提升

    就是如果两个子组件需要利用对方的状态的话,那么这个时候我们就需要使用到状态提升,具体做法就是把两个子组件的状态写到他们的父组件中,然后父组件把状态传递到子组件的props中去,这样子组件也相当于有状态

    父子组件传参

    父传子
    在父组件中,我们引入子组件,通过给子组件添加属性,来起到传参的作用,子组件可以通过props获取父组件传过来的参数

    //父组件
    import React from 'react'
    import ChildCom from './childCom.js'
    class ParentCom extends React.Component {
    render() {
    return (
    <div>
    <h1>父组件</h1>
    <ChildCom content={'我是父级过来的内容'}/>
    </div>
    )
    }
    }
    export default ParentCom;
    
    //子组件
    import React from 'react'
    class ChildCom extends React.Component {
    render() {
    return (
    <div>
    <h2>子组件</h2>
    <div>
    {this.props.content}
    </div>
    </div>
    )
    }//欢迎加入全栈开发交流群一起学习交流:864305860
    }
    export default ChildCom;
    

    子传父

    // 父组件
    
    import React from 'react'
    import ChildCom from './childCom.js'
    class ParentCom extends React.Component {
     state = {
     getChildValue: ''
     }
     getChildValue(value) {
     this.setState({
     getChildValue: value
     })
     }
     render() {
     return (
     <div>
     <h1>父组件</h1>
     <div>子组件过来的值为:{this.state.getChildValue}</div>
     <ChildCom onValue={this.getChildValue.bind(this)}/>
     </div>
     )
     }
    }
    export default ParentCom;
    
    //子组件
    
    import React from 'react'
    class ChildCom extends React.Component {
     valueToParent(value) {
     this.props.onValue(value);
     }
     render() {
     return (
     <div>
     <h2>子组件</h2>
     <div>
     <a onClick={this.valueToParent.bind(this,123)}>向父组件传值123</a>
     </div>
     </div>
     )
     }
    }
    export default ChildCom;
    

    子组件向父组件传参,其实就是在父组件中给子组件添加一个属性,这个属性的内容为一个函数,然后在子组件中调用这个函数,即可达到传递参数的效果

    四、setState 为何使用不可变的值

    • 不可变值
      可以用 this.state.arr.concat(100) 这样不会改变原来的数组arr,r如果用push就会改变原来的值,之所以这样做是因为在shouldCompomentUpdate 生命周期中,将要改变的值与之前的值做个比较来确定是否改变视图,以这种方式来优化性能
    • 可能会异步更新
    直接使用setState 是异步的
    this.setState({
      count:this.state.count + 1
    },()=>{
    console.log("count")
    })
    在setTimeout中使用是同步的
    setTimeOut(()=>{
      this.setState({
        count:this.state.count +1 
      })
    })
    自己定义的DOM事件是同步的
    document.body.addEventListener('click',()=>{
      this.setState({
        count:this.state.count +1 
      })
    })
    
    • 可能会被合并
      setState 异步更新(类似object.assign()),更新之前会被合并
    传入对象会被合并
    this.setState({
          count:this.state.count +1 
    })
    this.setState({
          count:this.state.count +1 
    })
    this.setState({
          count:this.state.count +1 
    })
    
    传入函数不会被合并,执行结果+3
    this.setState((prevState, props)=>{
      return {
            count:this.state.count +1 
      }
    })
    this.setState((prevState, props)=>{
      return {
            count:this.state.count +1 
      }
    })
    this.setState((prevState, props)=>{
      return {
            count:this.state.count +1 
      }
    })
    

    五、 react 生命周期

    挂载、渲染、卸载

    • componentWillMount加载前
    • componentDidMount,加载完成
    • componentWillReceiveProps (nextProps),在接受父组件改变后的props需要重新渲染组件时用到的比较多
    • shouldComponentUpdate(nextProps,nextState),主要用于性能优化,唯一用于控制组件重新渲染的生命周期
    • .componentWillUpdate (nextProps,nextState),shouldComponentUpdate返回true以后,组件进入重新渲染的流程,进入componentWillUpdate,这里同样可以拿到nextProps和nextState。
    • componentDidUpdate(prevProps,prevState),组件更新完毕
    • componentWillUnmount () 组件的卸载和数据的销毁

    六、 高级特性

    1.函数组件

    • 纯函数,输入props,输出JSX
    • 没有实例,没有生命周期,没有state
    • 不能扩展其他方法

    2. 非受控组件

    • ref
    • defalutValue,defalutChecked
    • 手动获取DOM元素

    使用场景

    • 必须手动操作DOM,setState实现不了
    • 文件上传 <input type="file">
    • 某些富文本编辑器,需要传入DOM

    受控组件和非受控组件

    • 优先使用受控组件,符合react设计原则(数据驱动视图)
    • 必须操作DOM,再使用非受控组件

    3. portals 传送门

    • 组件默认会按照既定层次嵌套渲染
    • 如何让组件渲染到父组件以外
      ReactDOM.createPortal(<div className="model">Model内容</div>,document.body)

    使用场景

    • 父组件设置overflow:hidden
    • 父组件z-index太小
    • fixed 需要放在body第一层级

    4. react context(上下文)

    使用场景

    • 公共信息如何传递给每个组件
    • 用props 太繁琐
    • 用redux 小题大作

    如何使用:

    1. 创建一个上下文容器
      const {Provider, Consumer} = React.createContext(defaultValue);
    2. provider用于生产共享数据的地方
      <Provider value={/共享的数据/}>
      /里面可以渲染对应的内容/
      </Provider>
    3. consumer,专门消费供应商产生的数据

    5. 异步组件

    • import
    • react.lazy
    • React.Suspense

    相关文章

      网友评论

          本文标题:react 视频总结

          本文链接:https://www.haomeiwen.com/subject/rrbvnhtx.html