剧场模式
首页前端React诱人的 react 视频教程-基础篇

诱人的 react 视频教程 - 基础篇 #14 组件生命周期(完结)

海外散仙厉飞雨 · 化神发布于
8

学习完此套教程的同学,可以移步实践篇:react 基础实践篇-小型财务系统

http://www.runoob.com/react/react-component-life-cycle.html

https://reactjs.org/docs/react-component.html

src/App.js

import React, { Component } from 'react';

import Header from './components/Header';
import Home from './components/Home';

class App extends Component {
  constructor() {
    super();
    this.state = {
      homeLink: "Home",
      homeMounted: true
    }
  }

  onGreet(age) {
    alert(age);
  }

  onChangeLinkName(newName) {
    this.setState({
      homeLink: newName
    })
  }

  onChangeHomeMounted() {
    this.setState({
      homeMounted: !this.state.homeMounted
    })
  }

  render() {
    const user = {
      name: "Anna",
      hobbies: ["Sports", "Reading"]
    }
    let homeCmp = "";
      if (this.state.homeMounted) {
        homeCmp = (
          <Home
            name={"Max"}
            initialAge={12}
            user={user}
            greet={this.onGreet}
            changeLink={this.onChangeLinkName.bind(this)}
            initialName={this.state.homeLink}
          />
        );
      }
    return (
      <div className="container">
        <div className="row">
          <div className="col-xs-1 col-xs-offset-11">
            <Header homeLink={this.state.homeLink} />
          </div>
        </div>
        <div className="row">
          <div className="col-xs-1 col-xs-offset-11">
            <h1>Hello !!</h1>
          </div>
        </div>
        <div className="row">
          <div className="col-xs-1 col-xs-offset-11">
            {homeCmp}
          </div>
        </div>
        <hr />
        <div className="row">
          <div className="col-xs-1 col-xs-offset-11">
            <button onClick={this.onChangeHomeMounted.bind(this)} className="btn btn-primary">(Un)mount Home Component</button>
          </div>
        </div>
      </div>
    );
  }
}

export default App;

src/components/Home.js

import React, { Component } from 'react';

import PropTypes from 'prop-types';

export default class Home extends Component {
  constructor(props) {
    super(props);
    this.state = {
      age: props.initialAge,
      status: 0,
      homeLink: props.initialName
    }
    setTimeout(() => {
      this.setState({
        status: 1
      })
    }, 3000)
    console.log('Constructor');
  }

  onMakeOlder() {
    this.setState({
      age: this.state.age + 3
    })
  }

  handleGreet() {
    this.props.greet(this.state.age)
  }

  onChangeLink() {
    this.props.changeLink(this.state.homeLink);
  }

  onHandleChange(event) {
    this.setState({
      homeLink: event.target.value
    })
  }

  componentWillMount() {
    console.log("Component will mount");
  }

  componentDidMount() {
    console.log("Component did mount");
  }

  componentWillReceiveProps(nextProps) {
    console.log('Component will receive props', nextProps);
  }

  shouldComponentUpdate(nextProps, nextState) {
    console.log('Component should update', nextProps, nextState);
    if (nextState.status === 1) {
      return false;
    }
    return true;
  }

  componentWillUpdate(nextProps, nextState) {
    console.log('Component will update', nextProps, nextState);
  }

  componentDidUpdate(prevProps, prevState) {
    console.log('Component did update', prevProps, prevState);
  }

  componentWillUnmount() {
    console.log('Component will unmount');
  }

  render() {
    console.log('render');
    return (
      <div className="container">
        <div className="row">
          <div className="col-xs-1 col-xs-offset-11">
            <div>your name is {this.props.name}, your age is {this.state.age}</div>
            <p>Status: {this.state.status}</p>
            <button onClick={() => {this.onMakeOlder()}} className="btn btn-primary">Make me older</button>
            <hr />
            <button onClick={this.handleGreet.bind(this)} className="btn btn-primary">Greet</button>
            <hr />
            <input
              type="text"
              defaultValue={this.props.initialName}
              value={this.state.initialName}
              onChange={(event) => this.onHandleChange(event)}
            />
            <button onClick={this.onChangeLink.bind(this)} className="btn btn-primary">Change Header Link</button>
          </div>
        </div>
      </div>
    );
  }
}

Home.propTypes = {
  name: PropTypes.string,
  age: PropTypes.number,
  user: PropTypes.object,
  greet: PropTypes.func,
  initialName: PropTypes.string
};
7 条回复
小程序(beta)抖音服务号订阅号
随机课程
学员
徐少侠 · 元婴骑龙 · 太乙阿震 · 真仙昀 · 元婴owenyikong · 道祖与UIuoi89898 · 道祖River- · 大乘wjfc · 太乙LeoTang · 元婴金丹期,大成 · 大乘小平头 · 元婴阿白 · 真仙imlhk · 元婴Hichank · 太乙ldc · 真仙kuckboy1994 · 太乙云 · 太乙kasni · 元婴陈召旭 · 元婴自然萌 · 元婴frank · 真仙shishihou · 道祖YanXinhua · 道祖Jean · 真仙zbx7858 · 道祖cc20140820 · 真仙🐳陈昱含🌟 · 元婴Sine · 合体ruanye · 元婴张文静 · 合体李卓 · 元婴红旗渠李鹏 · 元婴ownryan · 道祖     · 合体chenggge · 元婴CalvinSraub · 元婴山形瓦力 · 元婴Kevin · 元婴MeteorLx · 元婴那人 · 元婴靓狼仔 · 真仙Actor · 大罗招财加菲猫 · 金仙Blue米 · 大乘【静思屋】奇闻 · 元婴YJwsl · 练虚mfkyddh · 金仙kaixuan1992 · 道祖Max · 合体daniel_mea · 元婴LeoDo · 太乙娜娜 · 太乙jiaoxiaomei · 元婴caspertu · 真仙CunFlower · 合体Matthew · 道祖ChenCMP · 元婴程 · 合体肥啤啤 · 合体yhuyo · 道祖JoharChen · 合体liar · 真仙caoweiyu · 元婴何芳临 · 元婴naughtylyx · 元婴Android2Iphone · 练虚lwp007 · 元婴swip · 合体lianyunvjue · 元婴chloris · 太乙JSjump · 大罗miaozilong · 合体思进 · 大乘jixiyu · 元婴reb00t2018 · 元婴fmheart · 真仙chen-jiawei · 元婴背包客 · 合体ttswh2009 · 太乙gitwisdom · 元婴ttyring · 元婴me · 元婴chenjimin132 · 合体suntong233 · 元婴开心就好 · 合体linmiaomiao123 · 元婴CJY · 元婴Qujoe · 合体libin · 大乘FastTurbo · 道祖super · 大乘woshimaxiaorui · 真仙GmUy9xfK · 元婴wsadczh · 元婴bigHippoZz · 元婴itlaowang520 · 金仙duzhihao · 合体没有昵称 · 元婴pdfun · 元婴Vintage · 元婴ldn · 元婴远方。 · 元婴00Jane · 合体shaoqiming1028 · 元婴子非鱼 · 真仙shangxuewei · 元婴zwkjhx · 元婴Kelly · 元婴huxiaohui · 元婴a653398363 · 元婴qq540618173 · 元婴liunian1993 · 合体hyt9796 · 大乘lbb · 合体LINHANXIN · 元婴shmily1996 · 合体h23 · 太乙linhaijian · 元婴Godvmiku · 元婴Messi-Q · 元婴ralis366 · 元婴samuelshang · 太乙007sair · 元婴QQ741404277 · 练虚dannyking630 · 真仙
最新动态
徐少侠 · 元婴学习到了5:17
骑龙 · 太乙学习到了21:09
阿震 · 真仙学习到了3:01
昀 · 元婴学习到了2:29
owenyikong · 道祖学习到了21:09
统计信息
    学员: 14382
    视频数量: 824
    帖子数量: 418

© 汕尾市求知科技有限公司 | 粤ICP备19038915号 | 在线学员:116

Top