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> ) } }