一、React中定义组件
1.函数式组件(适用于[简单组件])
- 组件首字母必须大写
- 函数必须有返回值
- render的第一个参数是组件标签,不能直接写组件名字
function MyComponent(){
console.log(this);
return <h2>我是用函数定义的组件(适用于【简单组件】的定义)</h2>
}
ReactDOM.render(<MyComponent/>,document.getElementById('test'))
执行了ReactDOM.render(<MyComponent/>....... 之后,发生了什么?
- React解析组件标签,找到了MyComponent组件。
- 发现组件是使用函数定义的,随后调用该函数,将返回的虚拟DOM转为真实DOM,随后呈现在页面中。
2.类式组件(适用于[复杂组件])
- 必须基础React.Component父类
- 必须有render
- render必须有返回值
class MyComponent extends React.Component {
render(){
console.log('render中的this:',this);
return <h2>我是用类定义的组件(适用于【复杂组件】的定义)</h2>
}
}
ReactDOM.render(<MyComponent/>,document.getElementById('test'))
执行了ReactDOM.render(<MyComponent/>....... 之后,发生了什么?
- React解析组件标签,找到了MyComponent组件。
- 发现组件是使用类定义的,随后new出来该类的实例,并通过该实例调用到原型上的render方法。
- 将render返回的虚拟DOM转为真实DOM,随后呈现在页面中。
注意:
- 组件名必须首字母大写
- 虚拟DOM元素只能有一个根元素
- 虚拟DOM元素必须有结束标签
二、组件实例三大属性:state
复杂组件有状态,简单组件无状态
1.理解
- state是组件对象最重要的属性, 值是对象(可以包含多个key-value的组合)
- 组件被称为"状态机", 通过更新组件的state来更新对应的页面显示(重新渲染组件)
2.注意
- 组件中render方法中的this为组件实例对象
- 组件自定义的方法中this为undefined,如何解决?
a) 强制绑定this: 通过函数对象的bind() b) 箭头函数 - 状态数据,不能直接修改或更新,必须通过setState进行更新
3.例子
(1)state的使用
构造器中先初始化state(对象形式)
constructor(props){
super(props)
this.state = {isHot:false,wind:'微风'}
}
在render中通过三目表达式,判断是否显示炎热
render(){
const {isHot,wind} = this.state
return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热' : '凉爽'},{wind}</h1>
}
(2)事件绑定的写法
首先定义点击事件
render(){
const {isHot,wind} = this.state
return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热' : '凉爽'},{wind}</h1>
}
在类中定义事件处理函数,如果事件发生,则通过setState修改状态
changeWeather(){
const isHot = this.state.isHot
this.setState({isHot:!isHot})
}
但是,由于changeWeather是作为onClick的回调,所以不是通过实例调用的,是直接调用。而类中的方法默认开启了局部的严格模式,所以changeWeather中的this为undefined。
解决changeWeather中this指向问题,强制绑定this:
constructor(props){
this.changeWeather = this.changeWeather.bind(this)
}
4.简写方式
- 去掉构造器
- 自定义方法————要用赋值语句的形式+箭头函数
class Weather extends React.Component{
state = {isHot:false,wind:'微风'}
render(){
const {isHot,wind} = this.state
return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热' : '凉爽'},{wind}</h1>
}
changeWeather = ()=>{
const isHot = this.state.isHot
this.setState({isHot:!isHot})
}
}
ReactDOM.render(<Weather/>,document.getElementById('test'))
三、组件实例三大属性:props
1.理解
- 每个组件对象都会有props(properties的简写)属性
- 组件标签的所有属性都保存在props中
2.作用
- 通过标签属性从组件外向组件内传递变化的数据
- 注意: 组件内部不要修改props数据
四、组件实例三大属性:refs
五、React中事件处理
六、React中收集表单数据
五、高阶函数-函数柯里化
六、组件的生命周期
七、DOM的Diffing算法
|