react 入门

2019-04-25  本文已影响0人  他大舅啊

JavaScript函数创建

class

React.Component 的子类中有个必须定义的 render()函数

函数式组件 和 class 组件的使用场景说明:

constructor

class Home extends Component {
  render() {
    return (
      <div style={{background:'#0ff', fontSize:'20px', color:'#00f'}}>
        这是第一个demo
        <img src={logo} style={{width:'300px', height: '300px'}}/>
      </div>
    )
  }
}

变量的定义和初始化

class State extends Component {
  constructor(props) {
    super(props);
    this.state = {
      data: '一行白鹭上青天'
    };
  }
  render(){
    return (
      // 此处的注释
      <div style={{background: '#0ff', fontSize:'20px', color:'#00f'}}>
      {/* 此处的注释  必须要{}包裹 */}
        {this.state.data}
      </div>
    )
  }
}

在render 中创建

  class Rendercreated extends Component {
   render() {
     let data = 'js是世界上最好的语言';
     return(
       <div style={{background:'#0ff', fontSize:'20px', color:'#00f'}}>
         {data}
       </div>
     )
   }
}

事件的定义和使用

class Event extends Component {
  // 实例的构造函数 constructor
  // 必须调用super(), super表示父类的构造函数
  constructor(props){
    super(props);
    this.state = {
      data: '事件的定义和使用'
    }
  }
  //class创建的组件中 必须有rander方法 且显示return一个react对象或者null
  render() {
    return (
      <div>
        <div style={{background:'#999', marginTop:'20px'}} onClick={()=> this.click()}>
          {this.state.data}
        </div>
        <button className="button" onClick={() => this.clickParams(this.state.data)}>带参数的事件</button>
        <button className="button" onClick={() => this.changeData()}>操作变量值</button>
        <button className="button" onClick={this.Zidiao('自调用事件,页面加载就自己执行')}>自调用事件</button>
      </div>
    )
  }

  click = ()=> {
    alert('点到了~');
  };

  clickParams = (data)=> {
    alert(data);
  };

  changeData = ()=> {
    let num = Math.random();
    this.setState({
      data: `你说的对啊~${num}`
    })
  };

  Zidiao = (data)=> {
    console.log(data);
  }

}

生命周期

1、组件的定义

什么是组件?当一个页面所需要呈现出的内容过多,如果我们将所有的页面写在同一个.js文件中,会显得代码比较乱,给往后的代码维护造成困难。所以我们在编写代码的过程中,将某些部分提取出来,写在另一个组件中,然后在主页面中引入这个组件。
组件实际上是代码封装的一种,我们可以将经常使用到的一些功能及样式封装成一个组件,然后只需要调用这个组件便能调用这些功能和样式。这样做既方便了代码的管理又增加了可维护性。

2、组件的生命周期

在学习组件之前,我们必须先掌握组件的生命周期。一个组件从最开始的引入到最后的消亡,形成一段特殊的生命历程。这个生命历程成为组件的生命周期。

生命周期函数 就是在组件运行的某一时刻会自动运行的一些函数

class Period extends Component {
  constructor(props) {
    super(props);
    this.state = {
      data: '生命周期'
    };
  }
  render() {
    return (
      <div styel={{marginTop:'20px', fontSize:'20px'}} onClick={() => this.click()}>
        {this.state.data}
        <a href="http://www.baidu.com">这是百度</a>
      </div>
    )
  }

  click = ()=> {
    this.setState = {
      data: '点击了生命周期'
    }
  };

  componentWillMount = ()=> {
    console.log('1.在组件DOM树渲染前调用。当进入这个组件时执行')
  };
  componentDidMount=()=>{
    console.log(2);
  };
  componentWillReceiveProps=()=>{
    console.log(3);
  };
  shouldComponentUpdate=()=>{
    console.log(4);
    return true;
  };
  componentWillUpdate=()=>{
    console.log(5);
  };
  componentDidUpdate=()=>{
    console.log(6);
  };
  componentWillUnmount=()=>{
    console.log(7);
  };

}

组件

class Componenta extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  }
  render() {
    return (
      <div>
        <hr/>
        <div style={{display:'inline-block'}}>一行白鹭上青天</div> 
        <MyScreen></MyScreen>
      </div>
    )
  }
}

一个新的组件同样具备完整的生命周期

class MyScreen extends Component {
  constructor(props){
    super(props);
    this.state = {
      data: '这是一段另一个组件引入的代码块'
    };
    console.log(this.props)
  }
  render() {
    return (
      <div style={{color: 'green', display:'inline-block'}} onClick={()=> this.click()}>
        {this.state.data}
        <p>父组件内容:{this.props.name}</p>
      </div>
    )
  }

  click = ()=> {
    console.log('这是一段另一个组件引入的代码块');
  }

}

组件之间传递数据

class Propsdata extends Component{
  constructor(props){
    super(props);
    this.state = {
      parentData: '这是父组件的数据'
    }
  }
  render() {
    return (
      <div>
        <div style={{width:"100%",height:"300px",fontSize:"20px"}}>
          <div style={{width:"100%",height:"100px",backgroundColor:"#ff0"}}></div>
          <MyScreen name={this.state.parentData} />
          <div style={{width:"100%",height:"100px",backgroundColor:"#f0f"}}></div>
        </div>
      </div>
    )
  }
}

组件之间动态数据传递

class DynamicData extends Component {
  constructor(props){
    super(props);
    this.state = {
      parentData: '父组件的数据'
    };
  }
  render() {
    return (
      <div style={{marginTop: '20px'}}>
        <h3>动态数据传递</h3>
        <button className='button' onClick={()=> this.changeChildrenData()}>修改子组件数据</button>
        <ChildrenTemplate ref={ref => this.childrenRef = ref} data={this.state.parentData}/>
      </div>
    )
  }

  changeChildrenData = ()=>{
    console.log(this.childrenRef)
    this.childrenRef.setChildrenData(this.state.parentData + Math.random())
  }

}




class ChildrenTemplate extends Component {
  constructor(props){
    super(props);
    this.state = {
      data: '子组件的数据'
    };
  }
  render() {
    return (
      <div onClick={()=> this.click()}>
        {this.state.data}
      </div>
    )
  }

  //方法名和父组件的一致
  setChildrenData = (data)=> {
    console.log(data)
    this.setState({
      data: data
    })
  };

  click = ()=> {
    console.log('点击了');
  }

}

function Home(){
  return (
    <div>
      <State></State>
      <Rendercreated></Rendercreated>
      <Event></Event>
      <Period></Period>
      <Componenta></Componenta>
      <Propsdata></Propsdata>
      <DynamicData/>
    </div>
  )
}

export default Home
上一篇 下一篇

猜你喜欢

热点阅读