React笔记

参考:http://www.ruanyifeng.com/blog/2015/03/react.html

其中,React在ES6中去掉了getInitialState这个hook函数,规定state在constructor中实现。

自己用Demo:

var React = require('common:static/libs/react/react.min.js');
var ReactDOM = require('common:static/libs/react/reactdom.min.js');
var data =1;

var names=[
  <h1>Hello,World</h1>,
  <h2>React</h2>
];

var HelloMessageAnother = React.createClass({
  render:function(){
    return <div>Hello,{this.props.name}!</div>;
  }
});

var HelloMessage = React.createClass({
  render(){
    return <div>Hello,{this.props.name}!</div>;
  }
});

var MyTitle = React.createClass({
  propTypes:{
    title: React.PropTypes.string.isRequired,
  },
  
  render:function(){
    return <h1>{this.props.title}</h1>
  }
});

var MyTitleAnother = React.createClass({
  getDefaultProps:function(){
    return{
      title:'Hello World'
    };
  },
  render:function(){
    return <h1> {this.props.title} </h1>;
  }
});

var TestDom = React.createClass({

  handleClick:function(){
    this.refs.myTextInput.focus();
  },
  render:function(){
    return(
      <div>
        <input type="text"  ref="myTextInput" />
        <input type ="button" value = "focus the text input" onClick={this.handleClick}/>
      </div>
      );
  }

});

var LikeButton = React.createClass({
   getInitialState:function(){
    return {liked:false};
   },

   changeLike:function(){
    this.setState({liked:!this.state.liked});
   },

   render:function(){
    var text = this.state.liked?'like':'haven\'t liked';
    return(
      <p onClick={this.changeLike}>
        You {text} this. Click to toggle.
      </p>
      );
   }
});

var InputChangeState = React.createClass({
  getInitialState:function(){
    return {text:"Hello"};
  },

  changeInput:function(event){
    this.setState({
      text:event.target.value
    });
  },

  render:function(){
    var value = this.state.text;
    return (
      <div>
        <input type="text" onChange = {this.changeInput} />
        <p>{value}</p>
      </div> 
    );
  }
});

var OpacityComponent = React.createClass({
  getInitialState:function(){
    return {opacity:1.0};
  },

  componentDidMount:function(){
    this.timer = setInterval(function(){
      var opacity = this.state.opacity;
      opacity -= .05;
      if(opacity<0.1){
        opacity = 1.0;
      }
      this.setState({
        opacity:opacity
      });
    }.bind(this),100);
  },

  render:function(){
    return (
      <div style={{opacity:this.state.opacity}}>
        Hello,{this.props.name}
      </div>
      );
  }
});


ReactDOM.render(
  // <HelloMessage name="john"/>,
    // document.getElementById('test')

  // <MyTitle title={data} />,
  // document.body

  // <MyTitleAnother/>,
  // document.body

  // <TestDom />,
  // document.getElementById("test")

  // <LikeButton />,
  // document.getElementById("test")

  // <InputChangeState />,
  // document.getElementById("test")

  <OpacityComponent name="World"/>,
  document.getElementById("test")
);

ES6:

var React = require('common:static/libs/react/react.min.js');
var ReactDOM = require('common:static/libs/react/reactdom.min.js');

class SubmitOrderComponent extends React.Component{
	constructor(props){
		super(props);
		this.state = {
			ownerTel : "aaa"
		}
	}


	render(){
	    let self=this;	
	    return(
	        <div>
		//代码 注意外层必须有其他标签包着,不然会报错
		</div>
	    );
	}
};

ReactDOM.render(
	<SubmitOrderComponent />,
	document.getElementById("submitOrder")
);

基本流程:

var React = require('common:static/libs/react/react.min.js');
var ReactDOM = require('common:static/libs/react/reactdom.min.js');

class ArrayComponent extends React.Component{
constructor(props){
    super(props);
    this.state = {
      ownerTel : "aaa"
    }
  }

  getTest(){
    return (
      <h1>Hello</h1>
    );
  }

  render(){
    let self = this;
    return( 
      <div> //没有这个标签将会报错
        <div>Hello,ES6 {self.state.ownerTel}</div>
        {self.getTest()}
      </div>
    );
  }
};

ReactDOM.render(
  <ArrayComponent />,
  document.getElementById("test")
);

在所有的return中如果是一个标签可以直接返回,如果多个标签必须最外面再包一层,要保证return回的只有一个元素。

关于数组遍历:

var nameArray=[
  {
    "name":"aaaa",
    "age":"12"
  },
  {
    "name":"bbb",
    "age":"13"
  }
]
  //如下两种方法都可以进行遍历
 getArrayElement(){
    var str = "";
    for (var i = 0; i < nameArray.length; i++) {
      str = str + " " + nameArray[i].name + "/" + nameArray[i].age ;
    }
    return str;
  }

  getArrayMap(){
    var str = "";
    nameArray.map(function(n){
      str = str + " " + n.name + "/" + n.age;
    })
    return str;
  }

关于map:

var nameArray=[
  {
    "name":"aaaa",
    "age":"12"
  },
  {
    "name":"bbb",
    "age":"13"
  }
]

  getArrayMap(){
    return(
      nameArray.map(function(n){
        return <div>" " + n.name + "/" + n.age;</div>
      })
    )
  }

//对于map,因为其里面的函数function(n),会遍历数组生成
对应<div></div>包含的语句,在数组遍历外层需要用return()再
将返回的每条语句返回,这样就会打印出多条<div></div>包含的语句了。
但是此时<div></div>中的变量并未识别,还需要用{}.
所以正确的应该是:


  getArrayMap(){
    return(
      nameArray.map(function(n){
        return <div>{ " " + n.name + "/" + n.age}</div>
      })
    )
  }

 

关于函数调用:

非render中函数调用直接用:this.函数名(),如果在render中用self.函数名.bind(this)