官方文档 可参照本地文档
一、事件绑定
- 事件的名称都是React的提供的,因此名称的首字母必须大写
onClick、onMouseOver 为事件提供的处理函数,必须是如下格式
<button onClick={ function }>按钮</button>
事件绑定方式 ```javascript
1.方式1:普通函数绑定
// 事件的处理函数,需要定义为 一个箭头函数,然后赋值给 函数名称 function show(){ console.log(“show方法”) console.log(this) //undefined }
2.方式2:箭头函数绑定(此种方式用的比较多)
// 事件的处理函数,需要定义为 一个箭头函数,然后赋值给函数名称 show = (arg1) => { console.log(‘show方法’ + arg1) console.log(this) //当前组件对象 }
注意点:<br />1.在react中,箭头函数中的this就代表当前的组件对象,因为箭头函数的this其实质是定义函数时所在作用域中的this。<br />2.在react中,普通函数中的this是undefined。<a name="VgIKv"></a>## 二、修改事件的this并传递参数<a name="9JNpW"></a>#### 方式1:使用bind修改普通函数中的this指向```javascriptimport React, {Component} from 'react'class Test extends React.Component {constructor (props) {super(props)this.state = {message: 'Allo!'}}handleClick (name, e) {console.log(this.state.message + name)}render () {return (<div><button onClick={ this.handleClick.bind(this, '赵四') }>Say Hello</button></div>)}}
方式2: 在构造函数中通过bind修改this指向,返回新函数,然后在render中使用修改this指向后的新函数
import React, {Component} from 'react'class Test extends React.Component {constructor (props) {super(props)this.state = {message: 'Allo!'}this.handleClick = this.handleClick.bind(this)}handleClick (e) {console.log(this.state.message)}render () {return (<div><button onClick={ this.handleClick }>Say Hello</button></div>)}}
方式3:使用箭头函数
class Test extends React.Component {constructor (props) {super(props)this.state = {message: 'Allo!'}}handleClick = (e) => {console.log(this.state.message)}render () {return (<div><button onClick={ this.handleClick }>Say Hello</button></div>)}}
注意:
第二种和第三种方式如果这样用, ,此时会直接调用handleClick函数。如果想要点击按钮的时候才触发handleClick方法并且要给this.handleClick函数中传递参数,可以使用箭头函数。但一旦使用了箭头函数,那么箭头函数中的this就已经指向了当前的组件对象
三、绑定文本框与state中的值
- 在Vue中提供了
v-model指令,可以很方便的实现数据的双向绑定; - 但是在React中只是
单向数据流,也就是只能把state上的数据绑定到页面,无法把页面中数据的变化自动同步回 state ; 如果需要把页面上数据的变化保存到 state,则需要程序员手动监听onChange事件,拿到最新的数据,手动调用this.setState({ })更改回去。 这种方式叫受控组件3-1 受控组件
- 受控组件又称为智能组件,顾名思义受控组件就是受到控制的组件,受控组件是数据的所有者,它拥有数据、且拥有操作数据的action。它可以使用自己的state数据,也可以将数据和操作action传递给子组件,让子组件来完成UI或者功能。
- 比如在表单的input中,我们给input的value值为state.inputValue时,当用户对input进行操作时,没有对inputValue进行setState()操作,这个值不变,也就意味着input显示不变。
- 但是如果我们给input一个事件,在事件中进行对state的修改。每当用户输入时,input触发onChange事件,调用inputChange函数修改了value值。使用受控组件,每个状态的改变都有一个与之相关的处理函数。好处是可以直接修改或验证用户输入。
```javascript
//如果文本框没有指定onChange事件,那么该文本框是只读的,不可以修改
render() {
return (
) }<input value="this.state.value" onChange={this.inputChange}/>
inputChange = e => this.setState({value: e.target.value})
<a name="e0CcS"></a>### 3-2 非受控组件函数组件又称为“无状态组件”,“非受控组件”或“木偶组件”。非受控组件不同于受控组件,它自身并不能拥有可改变的数据。因为函数组件只负责接收 props 并返回 UI,在真实的 React 应用开发场景下,我们经常尽可能的使用函数组件,将整个应用的 UI 拆分成尽可能小的视觉单元。```javascriptclass NameForm extends React.Component {constructor(props) {super(props);this.handleSubmit = this.handleSubmit.bind(this);}handleSubmit(event) {alert('A name was submitted: ' +this.refs.mytxt.value);event.preventDefault();}render() {return (<form onSubmit={this.handleSubmit}><label>Name:<input type="text" ref="mytxt" /></label><input type="submit" value="Submit" /></form>);}}
Tip:
- 和 Vue 中差不多,Vue 为页面上的元素提供了 ref 的属性,如果想要获取元素引用,则需要使用this.$refs.name
- 在 React 中也有 ref, 如果要获取元素的引用this.refs.引用名称
3-3 React.createRef的使用
class CustomTextInput extends React.Component {constructor(props) {super(props);// 创造一个 textInput DOM 元素的 refthis.textInput = React.createRef();}render() {// 使用 `ref` 回调函数以在实例的一个变量中存储文本输入 DOM 元素//(比如,this.textInput)。return (<inputtype="text"ref={this.textInput}/>);}// 使用原始的 DOM API 显式地聚焦在 text input 上// 注意:我们通过访问 “current” 来获得 DOM 节点this.textInput.current.focus();}
3-4 ref回调
class NameForm extends React.Component {constructor(props) {super(props);this.handleSubmit = this.handleSubmit.bind(this);}handleSubmit(event) {alert('A name was submitted: ' + this.input.value);event.preventDefault();}render() {return (<form onSubmit={this.handleSubmit}><label>Name:<input type="text" ref={(input) => this.input = input} /></label><input type="submit" value="Submit" /></form>);}}
3-5 ref转发
Ref 转发是一个可选特性,其允许某些组件接收 ref,并将其向下传递(换句话说,“转发”它)给子组件。
const FancyButton = React.forwardRef((props, ref) => (<button ref={ref} className="FancyButton">{props.children}</button>));// 你可以直接获取 DOM button 的 ref:const ref = React.createRef();<FancyButton ref={ref}>Click me!</FancyButton>;
3-6 综合所述
以下是对上述示例发生情况的逐步解释:
- 我们通过调用 React.createRef 创建了一个 React ref 并将其赋值给 ref 变量。
- 我们通过指定 ref 为 JSX 属性,将其向下传递给
。 - React 传递 ref 给 fowardRef 内函数 (props, ref) => …,作为其第二个参数。
- 我们向下转发该 ref 参数到
- 当 ref 挂载完成,ref.current 将指向
