一、事件处理
- React 事件绑定属性的命名采用驼峰式写法,而不是小写。
- 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM 元素的写法)
- 在 React 中不能使用返回 false 的方式阻止默认行为, 你必须明确的使用 preventDefault。
class Toggle extends React.Component {
constructor(props) {
super(props);
this.state = {isToggleOn: true};
this.handleClick = this.handleClick.bind(this);// 这边绑定是必要的,这样 `this` 才能在回调函数中使用
}
handleClick() {
this.setState(state => ({
isToggleOn: !state.isToggleOn
}));
}
render() {
return (
<button onClick={this.handleClick}>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
);
}
}
- 向事件处理程序传递参数
// id为传参
// 通过箭头函数的方式,事件对象必须显式的进行传递
<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
// 通过 bind 的方式,事件对象以及更多的参数将会被隐式的进行传递
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>
在 HTML 当中,像 <input><textarea><select> 这类表单元素会维持自身状态,并根据用户输入进行更新。但在React中,可变的状态通常保存在组件的状态属性中,并且只能用 setState() 方法进行更新。
二、组件API
1、设置状态:setState
setState(object nextState[, function callback])
- nextState,将要设置的新状态,该状态会和当前的state合并
- callback,可选参数,回调函数。该函数会在setState设置成功,且组件重新渲染后调用。
Tips:
- setState()并不会立即改变this.state,而是创建一个即将处理的state。setState()并不一定是同步的,为了提升性能React会批量执行state和DOM渲染。
- setState()总是会触发一次组件重绘,除非在shouldComponentUpdate()中实现了一些条件渲染逻辑。
2、替换状态:replaceState
replaceState(object nextState[, function callback])
- nextState,将要设置的新状态,该状态会替换当前的state
- callback,可选参数,回调函数。该函数会在replaceState设置成功,且组件重新渲染后调用。
3、设置属性:setProps
setProps(object nextProps[, function callback])
- nextProps,将要设置的新属性,该状态会和当前的props合并
- callback,可选参数,回调函数。该函数会在setProps设置成功,且组件重新渲染后调用。
Tips:
- 设置组件属性,并重新渲染组件。
- props相当于组件的数据流,它总是会从父组件向下传递至所有的子组件中。
4、替换属性:replaceProps
replaceProps(object nextProps[, function callback])
- nextProps,将要设置的新属性,该属性会替换当前的props。
- callback,可选参数,回调函数。该函数会在replaceProps设置成功,且组件重新渲染后调用。
5、强制更新:forceUpdate
forceUpdate([function callback])
- callback,可选参数,回调函数。该函数会在组件render()方法调用后调用。
Tips:
-
forceUpdate()方法会使组件调用自身的render()方法重新渲染组件,组件的子组件也会调用自己的render()。
-
一般来说,应该尽量避免使用forceUpdate(),而仅从this.props和this.state中读取状态并由React触发render()调用。
6、获取DOM节点:findDOMNode
findDOMNode()
如果组件已经挂载到DOM中,该方法返回对应的本地浏览器 DOM 元素。当render返回null 或 false时,this.findDOMNode()也会返回null。
7、判断组件挂载状态:isMounted
返回值:true或false,表示组件是否已挂载到DOM中。
三、组件生命周期
1、渲染事件
constructor() :组件创建时,如果你不需要初始化 State就不需要定义这个方法;
render() :挂载时用来渲染内容的方法,每个类组件都需要一个 render 方法;
2、生命周期
-
componentWillMount:在
渲染前调用,在客户端也在服务端。 -
componentDidMount : 在第一次
渲染后调用,只在客户端,可通过this.getDOMNode()来进行访问。可在这个方法中调用setTimeout, setInterval或者发送AJAX请求等操作(防止异步操作阻塞UI)。 -
componentWillReceiveProps: 在组件接收到一个新的 prop (更新后)时被调用。在初始化render时不会被调用。
-
shouldComponentUpdate: 返回一个布尔值,在组件接收到新的props或者state时被调用。在初始化时或者使用forceUpdate时不被调用。
-
componentWillUpdate:在组件接收到新的props或者state但还没有render时被调用。在初始化时不会被调用。
-
componentDidUpdate: 在组件完成更新后立即调用。在初始化时不会被调用。
-
componentWillUnmount:在组件从 DOM 中
移除之前立刻被调用,一般在这里面销毁定时器等会导致内存泄露的内容。
3、将生命周期方法添加到类中 & 更新 State
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
// 第一次加载到 DOM 中的时生成定时器——挂载
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
}
// DOM 被移除的时清除定时器——卸载
componentWillUnmount() {
clearInterval(this.timerID);
}
tick() {
this.setState({// 更新 State,使得网页内容在渲染之后还能变化
date: new Date()
});
}
四、refs
React 支持一种非常特殊的属性 Ref ,可以用来绑定到 render() 输出的任何组件上。getDOMNode()方法也可以获取DOM元素。
<input ref="myInput" />
// 通过 this.refs 获取支撑实例:
var input = this.refs.myInput;
var inputValue = input.value;
var inputRect = input.getBoundingClientRect();