美文网首页
无状态组件

无状态组件

作者: 星期六1111 | 来源:发表于2017-09-28 23:50 被阅读52次

    问题描述

    晚上听小伙伴说,React的无状态组件,一时懵逼,之前没有听说过,知道的到关于react创建组件的方式仅有两种:

    • ES5写法:React.createClass
    • ES6写法:React.Component
    • 今天来尝试的第三种: 无状态组件

    矛盾点

    为什么会出现无状态组件?既然无状态的组件没有生命周期,那么setState的功能如何实现?

    问题解决

    Q1:无状态的组件是什么?
    A1:下面是官网上的一个例子

    const Todo = (props) => (
     <li onClick={props.onClick}
     style={{textDecoration: props.complete ? "line-through" : "none"}} >
     {props.text} 
     </li> 
    )
    

    首先,它更新了我的认知,组件不再是class 了,它可以是一个function,主要负责用来展示,没有状态(state)的影响所以就是纯静态展示的作用。。。。看起来,确实是比定义一个es6要简洁

    Q2:我们显示在页面上的数据一般都是通过父组件传递,this.props获取,无状态组件没有this,那么它是如何获取props的?
    A2:因为它的本身是一个函数,所以可以通过参数来获取。看下面的伪代码:

    //父组件
     <div>
      <AppComponent  data = {[]}   loadding = { true }  loadData = { 函数 }  />
     </div>
    
    //子组件
    const AppComponent = (props) =>{
         const { data, loadding, loadData } = props; // 通过es6的对象解构赋值的写法,直接从props获取到
         ……
         return <div>
          这是一个干净纯洁的stateless组件
         </div>
      }
    

    Q3:官网上说无状态组件没有生命周期,好奇没有状态那么setState的方法改怎么办?
    A3:看完demo ,哦,明白了。就是于我们常用的回调函数,自下而上的传值

    # 父组件
      import ChildComponent from './ChildComponent'; // 引入子组件
      class AppComponent extends React.Component {
       state = {  msg:null,  content: null   // 初始状态 }
    
       changeLoad(content){  // 这个方法是传递给子组件调用的,并且子组件会传递content过来
         this.setState({
          msg: '反向传递成功',
          content           // { content } 等同于 { content: content }
         })
       }
       render(){
         return 
          <div>  <ChildComponent   msg = { msg }   changeLoad = { this.changeLoad }   // 调用子组件并传递msg以changeLoad方法
           />
          </div>
       }
     }
    
    # 子组件
    const ChildComponent =({ msg, changeLoad })=>{
      const str = "I love you";
      return <div>
       { msg?msg:null }  
       <button onClick = { changeLoad(str) }> 点我传递str给父组件 </button>  // 调用父组件的changeLoad方法并传递str给父组件
      </div>
    }
    

    也就是说:无状态组件想要实现的setstate的两个初识条件:

    • 父组件不是stateless组件,它有生命周期。
    • 必须依赖于父组件

    反思

    感觉自己像井底之娃,只知道自己用的那一小点,学习知识还是要全面的,避免盲人摸象。

    action

    多看看react的官网,React的版本升级后,有些地方使用可能已经变了,完成一些新特性的练习demo.

    相关文章

      网友评论

          本文标题:无状态组件

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