React入门

栏目: 服务器 · 发布时间: 7年前

内容简介:React入门

React毫无疑问是2015年最为火热的前端框架。

React 是一个 Facebook用来创建用户界面的 JavaScript 库,React的目标就是 构建随着时间数据不断变化的大规模应用程序

我们在接下来的一系列文章来介绍React的相关知识。本章我们主要介绍React入门知识。

1. 开发环境

首先我们需要配置让sublime支持react语法,教程可见 这里

项目里面我们采用webpack解析React语法,因为开发React通常采用的JSX语法并不能直接被浏览器解析,我们需要在开发环境定义一套webpack loader来解析React,babel可以很好地实现这个需求,我们只需要在webpack.config.js定义如下loader:

{
    test: /\.jsx?$/, 
    exclude: /node_modules/,  
    loader: 'babel',
    query: { presets: ['react', 'es2015']} 
}

这样我们就可以愉快地编写React而不用担心浏览器不认识JSX了。

2. 常用API

1).React.createClass Function

React.createClass可以创建一个React组件类,结合React的虚拟DOM机制,我们就可以像搭积木一样组装好各个类,按需定制,这样在一些大型项目里面降低代码的耦合性,提高应用可扩展性。

通常createClass可以像这样定义:

var Hello = React.createClass({ 
    render: function(){
        return ( 
            <h1>Welcome to VocabGiant</h1>;
        );
    }
});

JSX的灵活之处还在于我们可以这样改造:

var Hello = React.createClass({ 
    render: function(){
        var welcome = <h1>Welcome to VocabGiant</h1>;
        return ( 
            welcome
        );
    }
});

我们也可以创建一个稍微实际点的demo:

var ListItem = React.createClass({
  render : function(){
    return (<li>{this.props.list}</li>)
  }
});


var List = React.createClass({
  render : function(){
    var listItems = [1,2,3].map(function(item){
      return <ListItemlist={item}/>;
    })

    return (
      <div>
        <ul>
          {listItems}
        </ul>
      </div>
    )
  }
});


React.render(<List/>,document.body);

这个跟上例区别在于同时涉及到父组件和子组件之间的通信,这里父组件通过 props (这里是list)将数据传递给子组件,子组件通过this.props.list获取传递的参数。最好再通过render将数据渲染出来。

2).props和state

props和state都可以用于组件间的通信和数据传输,他们的不同点在于props是单向传输并且不可变(immutable)的,一旦定义好了以后就不再变化,而state是可以从父组件从上往下传递,也可以由子组件从下往上传递,期间state可以在任意时刻改变。

上面的例子已经演示过了props的应用,下面我们通过实现一个简单的搜索筛选来演示state的应用。

首先我们定义一个List组件:

var ListItem = React.createClass({
  //term为提供的所有list数组集合
  render: function(){
    return (
      <li>
      {this.props.term}
      </li>
    );
  }
});

var ListItems = React.createClass({
  render: function(){
    //创建空数组保存筛选出来的字段
    var items = [];
    //父组件通过state更新filterTerm后再通过props传递给子组件
    var filterTerm = this.props.filterTerm;
    
    //遍历list数组,如果找到匹配字符就将新的iterm推送到之前创建的数组里
    this.props.terms.forEach(function(term){
      if (term.indexOf(filterTerm) != -1) {
        items.push(<ListItemkey={term}term={term}/>);
      }
    })

    return (
      <div>
        <ul>{items}</ul>
      </div>
    )
  }
});

这样我们就创建好了一个List的组件,接下来我们再来实现搜索框组件。

搜索框用于和用户进行交互,首先需要从上层组件获取数据,同时要将用户输入的数据与父组件进行通信。

var SearchBox = React.createClass({
  handleChange: function(){
    this.props.onUserInput(
      //这里refs会找到dom元素
      this.refs.filterTerms.value
    )
  },
//父组件通过fiilterTerm属性将上层数据交给searchBox组件,
//searchBox组件通过handleChange属性定义的方法将当前数据传回给父组件。
  render: function(){
    return (
      <formaction="">
            <inputtype="text"id="filter"ref="filterTerms"placeholder="Find term"onChange={this.handleChange}value={this.props.filterTerm}/>
        </form>
    )
  }
});

最后我们将当前两个组件组合一起:

var Home = React.createClass({
  getInitialState: function(){
    return {
      filterTerm: ""
    };
  },
  handleUserInput: function(filterTerm){
    this.setState({
      filterTerm: filterTerm
    })
  },

  render: function(){
    return (
      <div> 
          <SearchBox filterTerm={this.state.filterTerm} onUserInput={this.handleUserInput} /> 
          <ListItems
              filterTerm={this.state.filterTerm}
              terms={this.props.terms} />
        </div>
    )
  }
});

var terms = ['mare', 'sole', 'sabbia', 'acqua', 'spiaggia'];
React.render(<Home terms = {terms} />, document.body);

就这样,我们就创建好了一个完整的react组件。打开浏览器来体验一下,非常棒,不是么?

3).React状态生命周期

当我们需要开发一个实际项目时,通常我们需要异步获取线上数据,这个时候就不能像之前一样在本地指定静态数据了。这个时候就需要涉及到React状态生命周期。

var ListItem = React.createClass({
  render: function(){
    return (
      <li>{this.props.item.origin}</li>
    );
  }
});


var ListItems = React.createClass({
  render: function(){
    var listItems = this.props.items.map(function(item){
      return <ListItem item={item} key={item.origin} />;
    });

    return (<ul>
     {listItems}
      </ul>);
  }
});


var Home = React.createClass({
  getInitialState: function(){
    return {
      vocabulary: [],
    };
  },
  //这里实现异步请求
  componentDidMount: function(){
    $.get(this.props.url, function(result){
      var words = result.words;
      //需要确认当前组件已经被渲染到dom里了
      if (this.isMounted()) {
        this.setState({
          vocabulary: words
        });
      }
    }.bind(this));
  },

  render: function(){
    return (
      <div> 
    <ListItems items={this.state.vocabulary} /> </div>
    )
  }
});

//这时候我们只需要挂载url即可
ReactDOM.render(<Home url="/getVocabulary" />, document.body);

总结

目前我们已经完成了对react开发环境的构建、常见组件的渲染,父/子组件间通过props和state进行通信,并引入React状态生命周期来请求真实数据。


以上所述就是小编给大家介绍的《React入门》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Webbots、Spiders和Screen Scrapers

Webbots、Spiders和Screen Scrapers

斯昆克 / 2013-5 / 69.00元

《Webbots、Spiders和Screen Scrapers:技术解析与应用实践(原书第2版)》共31章,分为4个部分:第一部分(1~7章),系统全面地介绍了与Webbots、Spiders、Screen Scrapers相关的各种概念和技术原理,是了解和使用它们必须掌握的基础知识;第二部分(8~16章),以案例的形式仔细地讲解了价格监控、图片抓取、搜索排名检测、信息聚合、FTP信息、阅读与发......一起来看看 《Webbots、Spiders和Screen Scrapers》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具