占位符
this.handleChange.bind(this)
index.js:1375 Warning: Each child in a list should have a unique “key” prop.
state 不允许改变
<input className='input'
和变量传递一样,将父组件的方法通过props赋值传给子组件,注意要bind tihs
当state或props发生改变,render会重新执行 父组件发生变化,子组件的render都将执行
原始方案
state 数据模板jsx数据 + 模板,生成真实domstate发生改变数据 + 模板,生成正dom,替换原始dom(有问题,寻找替换方案↓)(方案2)数据 + 模板,生成正dom,不直接替换原始dom新dom和原始dom对比找出发生了变化的dom只用新dom中的元素替换老相同元素虚拟dom方案(草案)
state 数据模板jsx 3, 数据 + 模板,生成真实dom,显示 <div id='abc'><span>hello</span></div> 生成虚拟dom (js对象) (损耗新能) ['div', {id: 'abc'}, ['span', {}, 'hello world']] state发生变化数据 + 模板,生成新的虚拟dom (提升了性能) ['div', {id: 'abc'}, ['span', {}, 'bye bye']] 比较原始dom和新dom的区别,定位到变化的span (提升了性能)直接操作dom,改变span中的内容虚拟dom方案(实际)
state 数据模板jsx生成虚拟dom (js对象) ,显示,(损耗新能) jsx -> createElement -> js对象(虚拟dom) -> 真实dom ['div', {id: 'abc'}, ['span', {}, 'hello world']] // render 对比 render() { const { content, test } = this.props // 结构赋值 return <div><li>node node</li></div> // return React.createElement('div', {}, React.createElement('li', {}, 'node node')) }4, 数据 + 模板,生成真实dom,显示
<div id='abc'><span>hello</span></div> state发生变化数据 + 模板,生成新的虚拟dom (提升了性能) ['div', {id: 'abc'}, ['span', {}, 'bye bye']] 比较原始dom和新dom的区别,定位到变化的span (提升了性能)直接操作dom,改变span中的内容diff
同级比较,如果同层不一样,那么下面就不再比较了
用index做key值的弊端
key值不稳定
例子:
不稳定:
a 0 b 1 c 2 删除a标签 b 0 c 1
稳定:
a a b b c c 删除a标签 b b c c
ref直接操作dom
<input id='insertArea' className='input' ref={(xx) => this.xx = xx}setState 第二个函数
使用场景:例如在页面更新后再去获取dom
// - constructor
initialization
set state and propsmounting
componetWillMountrendercomponetDidMountupdating
(props
componentWillReceiveProps
没有props参数(没有父组件)的话,不会被执行
一个组件要从父组件接受参数该组件第一次存在于父组件中,不会执行已存在,才会执行(state
(props, state公共生命周期:)
shouldComponentUpdate(bool, 组件被更新之前)
componentWillUpdate(组件被更新之前,should之后)
rendercomponentDidUpdateunmounting
componentWillUnmont
被从页面上移除时