React笔记_(3)_react语法2

React笔记_(3)_react语法2  

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 );

 

就这么多吧。

感觉一会不用,就渐渐的忘记了哇。

 

还是老套路:

点此下载说明和代码

 

posted @ 2016-12-06 10:12  风来风往风伤(TiAmo)  阅读(206)  评论(0编辑  收藏  举报