state和refs
props就是在render渲染时,向组件内传递的变量,这个传递是单向的,只能继承下来读取。
如何进行双向传递呢?
state (状态机)
React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。
React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。
下面是一个例子。
一个文本框,一个按钮,按钮点击控制文本框的可用和不可用。
'use strict'; import React, { Component } from 'react'; import ReactDOM from 'react-dom'; class InputState extends Component { constructor(props) { super(props); this.state = { enable: false }; } inputClick() { this.setState({ enable: !this.state.enable }); } render() { return ( <p> <input type="text" disabled={this.state.enable} /> <button type="button" onClick={this.inputClick.bind(this)}>change input state</button> </p> ); } } ReactDOM.render(<InputState />, document.getElementById("app") );
refs
React 支持一种非常特殊的属性 Ref ,你可以用来绑定到 render() 输出的任何组件上。
这个特殊的属性允许你引用 render() 返回的相应的支撑实例( backing instance )。这样就可以确保在任何时间总是拿到正确的实例。
举个例子:
一个文本框输入内容,点击按钮获取内容。
1 'use strict'; 2 import React, { Component } from 'react'; 3 import ReactDOM from 'react-dom'; 4 5 class InputContent extends Component { 6 7 getInputValue() { 8 var inputValue = this.refs.myInput.value; 9 alert(inputValue); 10 } 11 12 render() { 13 14 return ( 15 <p> 16 <input type="text" ref="myInput" /> 17 <button type="button" onClick={this.getInputValue.bind(this)}>get input value</button> 18 </p> 19 ); 20 21 } 22 23 } 24 25 ReactDOM.render(<InputContent />, 26 document.getElementById("app") 27 );
了解到了state和refs的用法,做一个简单的小功能吧。
一个文本框和一组数据,在文本框中输入内容,对这组数据进行过滤。
1 'use strict'; 2 import React,{ Component } from 'react'; 3 import ReactDOM from 'react-dom'; 4 //小部件,渲染为ul列表 5 class Items extends Component { 6 render(){ 7 var arrLi = []; 8 for(let i=0;i<this.props.info.length;i++){ 9 //注意,这里可不是拼接字符串! 10 arrLi.push(<li key={i}>{this.props.info[i]}</li>); 11 } 12 return (<ul>{arrLi} </ul>); 13 } 14 } 15 //大部件 16 class Box extends Component { 17 constructor(props){ 18 super(props); 19 this.state = { 20 list:this.props.sourceData 21 } 22 } 23 checkSth(){ 24 var arr = []; 25 //获取文本框信息 26 var inputValue = this.refs.myInput.value; 27 //获取props信息 28 var sourceData = this.props.sourceData; 29 //筛选数据 30 for(let i=0;i<sourceData.length;i++){ 31 if(sourceData[i].indexOf(inputValue)!=-1){ 32 arr.push(sourceData[i]); 33 } 34 } 35 //更新状态机 36 this.setState({list:arr}); 37 } 38 render(){ 39 return ( 40 <div> 41 <input type="text" ref="myInput" onKeyUp={this.checkSth.bind(this)}/> 42 <Items info={this.state.list} /> 43 </div> 44 ); 45 } 46 } 47 var data = ['jackson','milly','john smith','mike','jenny']; 48 ReactDOM.render( 49 <Box sourceData={data} />, 50 document.getElementById('app') 51 );
就这么多吧。
感觉一会不用,就渐渐的忘记了哇。
还是老套路: