React Native系列之-React.js介绍

由于React Native是拿React.js来开发的,那么我们就需要了解下React.js,并学习下React.js的语法 。
    以下内容为官网介绍:
    React是Facebook推出的一个用来构建用户界面的JavaScript库。具备以下特性:
    1.仅仅是UI,在使用React的时候,许多人仅仅是当做MVC的V层。
    2.虚拟DOM(virtual DOM),React为了更高超的性能而使用虚拟DOM作为其不同的实现。他同事也可以由服务器Node.js渲染-而不需要过重的浏览器DOM支持。


    以下内容来自[简书](http://www.jianshu.com/p/ae482813b791)
    Facebook认为MVC无法满足他们的扩展需求,由于他们非常巨大的代码库和庞大的组织,使得MVC很快变得非常复复杂,每当需要添加一项新的功能或特性时,系统的复杂度就成级数增长,致使代码变得脆弱和不可预测,结果导致他们的MVC正在土崩瓦解。认为MVC不适合大规模应用,当系统中有很多的模型和相应的视图时,其复杂度就会迅速扩大,非常难以理解和调试,特别是模型和视图间可能存在的双向数据流动。解决这个问题需要“以某种方式组织代码,使其更加可预测”,这通过他们(Facebook)提出的Flux和React已经完成。

    接下来我们继续看下官网上的一些简单介绍吧。
  • 一个简单地组件
    React组件通过一个render()方法,接受输入的参数并返回展示的对象。使用JSX语法(类似于XML语法),输入的参数通过render()传入组件后,将存储在this.props。JSX是可选的,并不强制使用。
    Live JSX Editor
<!DOCTYPE html>
<html>
  <head>
    <script src="../build/react.js"></script>
    <script src="../build/browser.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel"> var HelloMessage =React.createClass({ render:function(){ return <div>Hello {this.props.name}</div>; } }); React.render(<HelloMessage name="quanshijie" />,document.getElementById('example') ) </script>

  </body>
</html>

Compiled JS

var HelloMessage = React.createClass({displayName: "HelloMessage",render: function() {
    return React.createElement("div",null,"Hello ",this.props.name);
  }
});

React.render(React.createElement(HelloMessage,{name: "quanshijie"}),document.getElementById('example'));

显示结果:

  • 一个有状态的组件
    -除了接受输入数据(通过this.props),组件还可以保持内部状态数据(通过this.state),当一个组件的状态数据变化时,展现的标记将被重新调用render()更新。
    Live JSX Editor
<!DOCTYPE html>
<html>
  <head>
    <script src="../build/react.js"></script>
    <script src="../build/browser.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel"> var Timer =React.createClass({ getInitialState:function(){ return {secondsElapsed:0}; },tick:function(){ this.setState({secondsElapsed:this.state.secondsElapsed+1}); },componentDidMount:function(){ this.interval=setInterval(this.tick,1000); },componentWillUnmount:function(){ clearInterval(this.interval); },render:function(){ return <div>Seconds Elapsed--quanshijie:{this.state.secondsElapsed}</div> } }); React.render(<Timer />,document.getElementById('example') ) </script>

  </body>
</html>

Compiled JS

var Timer = React.createClass({displayName: "Timer",getInitialState: function() {
    return {secondsElapsed: 0};
  },tick: function() {
    this.setState({secondsElapsed: this.state.secondsElapsed + 1});
  },componentDidMount: function() {
    this.interval = setInterval(this.tick,1000);
  },componentWillUnmount: function() {
    clearInterval(this.interval);
  },render: function() {
    return (
      React.createElement("div","Seconds Elapsed--quanshijie ",this.state.secondsElapsed)
    );
  }
});

React.render(React.createElement(Timer,null),document.getElementById('example'));

运行结果下图:(计时器的效果)

  • 一个应用程序
    通过使用props和state,我们可以组合构建一个小型的Todo程序。下面的例子使用state去监测当前列表的项以及用户已经输入的文本。尽管时间绑定似乎是内联的方式,但他们将被收集起来并以时间代理的方式实现。
    Live JSX Editor
<!DOCTYPE html>
<html>
  <head>
    <script src="../build/react.js"></script>
    <script src="../build/browser.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel"> var TodoList = React.createClass({ render:function(){ var createItem = function(itemText){ return <li>{itemText}</li>; }; return <ul>{this.props.items.map(createItem)}</ul>; } }); var TodoApp = React.createClass({ getInitialState:function(){ return {items:[],text:''}; },onChange:function(e){ this.setState({text:e.target.value}); },handleSubmit:function(e){ e.preventDefault(); var nextItems= this.state.items.concat([this.state.text]); var nextText = ''; this.setState({items:nextItems,text:nextText}); },render:function(){ return ( <div> <h3>TODO</h3> <TodoList items={this.state.items} /> <form onSubmit={this.handleSubmit}> <input onChange={this.onChange} value={this.state.text} /> <button>{'Add #' + (this.state.items.length + 1)}</button> </form> </div> ); } }); React.render(<TodoApp />,document.getElementById('example') ) </script>

  </body>
</html>

Compiled JS

var TodoList = React.createClass({displayName: "TodoList",render: function() {
    var createItem = function(itemText) {
      return React.createElement("li",itemText);
    };
    return React.createElement("ul",this.props.items.map(createItem));
  }
});
var TodoApp = React.createClass({displayName: "TodoApp",getInitialState: function() {
    return {items: [],text: ''};
  },onChange: function(e) {
    this.setState({text: e.target.value});
  },handleSubmit: function(e) {
    e.preventDefault();
    var nextItems = this.state.items.concat([this.state.text]);
    var nextText = '';
    this.setState({items: nextItems,text: nextText});
  },React.createElement("h3","TODO"),React.createElement(TodoList,{items: this.state.items}),React.createElement("form",{onSubmit: this.handleSubmit},React.createElement("input",{onChange: this.onChange,value: this.state.text}),React.createElement("button",'Add #' + (this.state.items.length + 1))
        )
      )
    );
  }
});

React.render(React.createElement(TodoApp,document.getElementById('example'));

运行结果下图:

  • 一个使用外部插件的组件
    React是灵活的,并且提供方法允许你跟其他库和框架对接。下面例子展现一个案例,使用外部库Markdown实时转化textarew的值。
<!DOCTYPE html> <html> <head> <script src="../build/react.js"></script> <script src="../build/browser.min.js"></script> <script src="http://cdnjs.cloudflare.com/ajax/libs/showdown/0.3.1/showdown.min.js"></script> </head> <body> <div id="example"></div> <script type="text/babel"> var converter = new Showdown.converter(); var MarkdownEditor = React.createClass({ getInitialState: function() { return {value: 'Type some *markdown* here!'}; },handleChange: function() { this.setState({value: this.refs.textarea.getDOMNode().value}); },render: function() { return ( <div className="MarkdownEditor"> <h3>Input</h3> <textarea  onChange={this.handleChange} ref="textarea" defaultValue={this.state.value} /> <h3>Output</h3> <div  className="content" dangerouslySetInnerHTML={{ __html: converter.makeHtml(this.state.value) }} > </div> </div> ); } }); React.render(<MarkdownEditor />,document.getElementById('example') ) </script> </body> </html> 

注意,这里引用了showdown.js。
Compiled JS

var converter = new Showdown.converter();

var MarkdownEditor = React.createClass({displayName: "MarkdownEditor",getInitialState: function() {
    return {value: 'Type some *markdown* here!'};
  },handleChange: function() {
    this.setState({value: this.refs.textarea.getDOMNode().value});
  },{className: "MarkdownEditor"},"Input"),React.createElement("textarea",{
          onChange: this.handleChange,ref: "textarea",defaultValue: this.state.value}),"Output"),React.createElement("div",{
          className: "content",dangerouslySetInnerHTML: {
            __html: converter.makeHtml(this.state.value)
          }}
        )
      )
    );
  }
});

React.render(React.createElement(MarkdownEditor,document.getElementById('example'));

运行效果下图:

到这里,简单的介绍就算完了。下一篇将带给大家React的语法。

  1. 参考资料React官网
  2. 参考资料React的起因
  3. 参考资料React中文版文档

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom