zoukankan      html  css  js  c++  java
  • react--知识点

    react执行顺寻

    constructor->componentWillMount->render->ComponentDidMount->render

    一个React项目需要更新一个小组件时,很可能需要父组件更新自己的状态。而一个父组件的重新更新会造成它旗下所有的子组件重新执行render()方法,形成新的虚拟DOM,再用diff算法对新旧虚拟DOM进行结构和属性的比较,决定组件是否需要重新渲染

    无疑这样的操作会造成很多的性能浪费,所以我们开发者可以根据项目的业务逻辑,在shouldComponentUpdate()中加入条件判断,从而优化性能

    react 父子组件调用

    import React, { Component } from "react"
    import ProTypes from "prop-types"
    
    class User extends Component {
    
        constructor(props) {
            super(props);
            this.state = {
                date: "2222"
            };
    
            this.username = "张三";
    
            console.log("props", props);
        }
    
    
        componentDidMount() {
            console.log("componentDidMount", "componentDidMount");
    
    
    
    
        }
    
        componentWillUnmount() {
            console.log("componentDidMount", "componentDidMount");
        }
    
        addUser = () => {
            this.setState({
                date: "1111"
            })
    
            alert("子组件方法");
        }
    
        diaoyongApp = () => {
            //调父方法
            const { appTest } = this.props;
            appTest();
        }
    
    
        render() {
            console.log("render", "render");
            return (
                <div>
                    1-{this.username}
                    2-{this.props.name}
                    3-{this.props.other}
    
                    <p><button onClick={this.diaoyongApp.bind(this)}> 调用父方法</button></p>
                </div>
            )
        }
    }
    //验证传递得参数,如果不对会有警告
    User.ProTypes = {
        //传递参数是string,必选项
        name: ProTypes.string.isRequired
    }
    
    export default User
    import React, { Component } from "react"
    import User from "./User"
    /**
     * <>标签必须结束
     */
    class App extends Component {
    
      constructor(props) {
        super(props);
        this.state = {
        };
    
        this.appdata = "aaa";
      }
    
      // appTest = () => {
      //   alert("父方法" + this.appdata);
      // }
    
      appTest() {
        alert("父方法" + this.appdata);
      }
    
      //调用子方法
      diaoyongChild = () => {
        this.user.addUser();
      }
    
    
      render() {
        console.log("appdata", this.appdata);
        let appobj = "bbb";
        return (
          <div className="App">
            <User name="张三" other={appobj} appTest={this.appTest.bind(this)} ref={user => this.user = user} />
    
            <button onClick={this.diaoyongChild}>调用子组件方法</button>
    
          </div>
        )
      }
    }
    
    export default App
     //react 父组件调用子组件中的事件
    
    import React, {Component} from 'react';
    
    export default class Parent extends Component {
    
      render() {
    
        return(
    
            <div> <Child onRef={this.onRef} />
    
            <button onClick={this.click} >click</button>
    
            </div>
    
        )
    
      }
    
      onRef = (ref) => {
    
        this.child = ref
    
      }
    
      click = (e) => {
    
        this.child.myName()
    
      }
    
    }
    
     
    
    class Child extends Component {
    
    constructor(props){
        super(props);
        this.state = {value: ''};
    }
    
      componentDidMount(){
    
        this.props.onRef(this)
    
      }
    
      myName = () => {
    
        this.setState({value:'boonook'});
    
      }
    
    render(){
        return(
            <div>
                我是子组件
                <input value={this.state.value} type="text"/>
            </div>
        )
    }
    
    }
  • 相关阅读:
    CSS3实现3D木块旋转动画
    灰色大气企业html5模板
    同程联盟景点门票动态程序 beta1.0源码
    java 创建 HMAC 签名
    左侧浮动html网页模板
    农业公司flash动画模板
    纯CSS3左右滑动开关按钮
    jQuery移动光标改变图像
    四叶草与动感线条背景矢量图
    看过的bootstrap书籍(附下载地址)
  • 原文地址:https://www.cnblogs.com/jentary/p/13501721.html
Copyright © 2011-2022 走看看