自由元件與受控元件
自由元件是指值不受Reactstate控制的form元素,而受控元件指的是值被Reactstate所控制的form元素
import React, {Component} from "react";
import "./App.css";
// import PropTypes from 'prop-types';
class ControllerComponent extends Component {
constructor(){
super();
this.state = {
name: "",
id: ""
}
}
handelChange = event =>{
console.log(event.nativeEvent);
console.log(event.target);
this.setState({
[event.target.name]:event.target.value
})
}
render(){
return (
<div>
<label htmlFor="#name">姓</label>
<input name="name" value={this.state.name} onChange={this.handelChange} type="text" id="name"></input><br/>
<label htmlFor="#id">名</label>
<input name="id" value={this.state.id} onChange={this.handelChange} type="text" id="id"></input>
<br/>
<button onClick={console.log(this.state)}>Click</button>
</div>
)
}
}
class App extends Component {
constructor(){
super();
this.state = {
}
}
render(){
return (<div>
<ControllerComponent></ControllerComponent>
</div>)
}
}
export default App;
複製程式碼
Event
React中的Event是官方經過處理的合成事件,所以在使用時我們可以忽略一部分的相容問題,值得注意的是,Event時全域性唯一的事件處理器,當我們需要在非同步情況下使用event時需要格外注意,因為Event使用完都會被置空,所以在setTimeout等非同步操作下無法正常獲取Event
- 官網上的說法是Event是被池化的,也就是被迴圈使用的,當每次回撥函式執行完成都會置空event,這就導致當你在非同步中呼叫event時是無法使用的,因為event是object,是引用資料型別,堆中存放著物件,而棧中只是存著一個地址,當回撥函式結束給清空時,我們在非同步函式中自然而然就取不到值了。
handelClick = event=> {
console.log(event);
const _event = Object.assign({}, event)
event.persist()
setTimeout(() => {
console.log(event)
console.log(_event);
}, 100);
}
複製程式碼
ref 操作DOM,不得不使用的命令式操作
ref接受一個回撥函式,而不是直接接收一個變數,接受回撥函式是為了在元件掛載和銷燬時重新呼叫,需要謹慎使用。