为什么要学习React?换句话说,为什么原生js不够好呢?
- 原生JS操作DOM繁琐,效率低(DOM-API操作UI)
- 原生JS直接操作DOM,浏览器会进行大量的重绘重排
- 原生JS没有组件化编码方案,代码复用率低
虚拟DOM
- 本质是Object类型的对象(一般对象)
- 虚拟DOM比较“轻”,真实DOM比较“重”,因为虚拟DOM是React内部在用,无需真实DOM上那么多的属性
- 虚拟DOM最终会被React转化为真实DOM,呈现在页面上
JSX语法规则
- 定义虚拟DOM时,不要写引号。
- 标签内混入JS表达式时要用{}。
- 样式的类名指定不要用class,要用className。
- 内联样式,要用style={{key:value}}的形式去写。
- 只有一个根标签。
- 标签必须闭合。
- 标签首字母:
- 若小写字母开头,则将该标签转为html中同名元素,若html中无该标签对应的同名元素,则报错。
- 若大写字母开头,react就去渲染对应的组件,若组件没有定义,则报错。
JS复习
- JS类里定义的方法定义在哪里了呢?类的原型对象上(__proto__里),供实例使用。通过实例调用方法里的this,this指向的就是类的实例对象。
- 如何判断this是谁?那取决于this是怎么调用的。
组件
- 组件可以通过函数声明的方式创建,也可以通过类式组件创建。
- 创建类式组件的时候,一定要extend React.Component
class MyComponent extends React.Component {
render() {
return (
<div>
<h2>This is my component.</h2>
</div>
)
}
}


状态和展示
- 组件的状态里存着数据,数据的改变就会驱动页面的展示。
类中的方法this指向
- 类中所有定义的方法都在局部开启了严格模式,所以const x = p1.study的话,调用x(),里面的this是undefined而不是window

现在的问题是当h1标签被click,调用回调函数changeWeather时,函数里的this为undefined,那该怎么办呢?

状态不可直接更改,需要调用setState({…})来更改,且更新是一种合并,不是替换。也就是说,同名的就替换了,不同名的保留。
如果不想写的这么麻烦,那可以用这种写法,完美解决this的问题

总结一下,state如果不依赖传参进来,直接写到class体内,然后方法也写成property的形式,并用箭头函数给其赋值。
对props进行限制:

组件的生命周期(旧版)

组件的生命周期(新版)


其实不管是新的生命周期还是旧的,常用的就3个:
- render: 初始化渲染或更新渲染调用
- componentDidMount:开启监听,发送ajax请求
- componentWillUnmount: 做一些收尾工作,如:清理定时器
三个废弃的钩子:
- componentWillMount
- componentWillReceiveProps
- componentWillUpdate
连续解构赋值加重命名:
