浅谈 React

机缘巧合认识React,翻了2天的资料,又整理了1天,也算是简单入门了;之前也学过angular,相比来说,的确React代码逻辑更加简单明了,理解起来也相对容易。

React 具备以下特性:1.声明式设计 ?React采用声明范式,可以轻松描述应用。

          2.高效 ?React通过对DOM的模拟,最大限度地减少与DOM的交互。

          3.灵活 ?React可以与已知的库或框架很好地配合。

          4.JSX ? JSX 是 JavaScript 语法的扩展。React 开发不一定使用 JSX ,但我们建议使用它。

          5.组件 ? 通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中。

          6.单向响应的数据流 ? React 实现了单向响应的数据流,从而减少了重复代码,这也是它为什么比传统数据绑定更简单。

下面是我整理的一些关于React的入门知识

注:下面所示事例中只引入react.js(核心JS)、react-dom.js(关于DOM的JS)、browser.min.js(JSX解读),可直接到官网下载最新的源码:https://facebook.github.io/react/

一、ReactDOM.render 是 React 的最基本方法:用于将模板转为 HTML 语言,并插入指定的 DOM 节点

ReactDOM.render(
  <h1>Hellow World!</h1>,
  document.getElementById(‘example‘)
);

二、JSX 语法 -- React 首次提出的一种语言

JSX 语法:HTML 语言直接写在 JavaScript 语言之中,不加任何引号,这就是 JSX 的语法,它允许 HTML 与 JavaScript 的混写;

JSX 允许直接在模板插入 JavaScript 变量。如果这个变量是一个数组,则会展开这个数组的所有成员,添加到模板。

例1:var names = [‘Alice‘, ‘Emily‘, ‘Kate‘];

ReactDOM.render(
   <div>
     {
       names.map(function (name) {
         return <div><span>Hello, {name}!</span></div>
       })
     }
   </div>,
  document.getElementById(‘example‘)
);

例2:var arr = [

        <h1>I have a dream!</h1>,
        <h2>I have a day!</h2>,
        ];
ReactDOM.render(
  <div>{arr}</div>,
  document.getElementById(‘example‘)
);

JSX具备以下优点:1.JSX 执行更快,因为它在编译为 JavaScript 代码后进行了优化。

         2.它是类型安全的,在编译过程中就能发现错误。

         3.使用 JSX 编写模板更加简单快速。


三、组件 API

  1.设置状态:setState

  2.替换状态:replaceState

  3.设置属性setProps

  4.替换属性replaceProps

  5.强制更新:forceUpdate

  6.获取DOM节点:findDOMNode

  7.判断组件挂载状态:isMounted

  8.生成组件类:createClass

(关于createClass):React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件。React.createClass 方法就用于生成一个组件类

注意:添加组件属性,需要注意的就是 class 属性需要写成 className ,for 属性需要写成 htmlFor,因为for与class 是 JS 中的关键字(其他属性可直接使用)

例:

var HelloMessage = React.createClass({
  render: function() {
    return (
      <div>
        <h1>{this.props.name}</h1>
        <a href={this.props.site}>{this.props.site}</a>
      </div>

     )
  }
});

ReactDOM.render(
  <HelloMessage name="百度" site="www.baidu.com"/>,
  document.getElementById(‘example‘)
);

复合组件:通过创建多个组件来合成一个组件

var HelloMessage = React.createClass({
  render: function() {
    return (
      <div>
        <Name name={this.props.name}/>
        <Site site={this.props.site}/>
      </div>
    )
  }
});

var Name = React.createClass({
  render: function() {
    return <h1>{this.props.name}</h1>
  }
});
var Site = React.createClass({
  render: function() {
    return <a href={this.props.site}>{this.props.site}</a>
  }
});

ReactDOM.render(
  <HelloMessage name="百度" site="www.baidu.com"/>,
  document.getElementById(‘example‘)
);

四、this.props.children 属性

前面的例子中提到:this.props 表示对象的属性与组件的属性一一对应;但是 this.props.children 属性表示组件的所有子节点

var NotesList = React.createClass({
  render: function() {
    return (
      <ol>
        {
          React.Children.map(this.props.children, function (child) {

            return <li>{child}</li>;

          )
        }
      </ol>
    );
  }
});

ReactDOM.render(
  <NotesList>
    <span>LiLei</span>
    <span>HanMeimei</span>
  </NotesList>,
  document.getElementById(‘example‘)
);

  this.props.children 的值有三种可能:  1.如果当前组件没有子节点,它就是 undefined

                    2.如果有一个子节点,数据类型是 object

                    3.如果有多个子节点,数据类型就是 array

五、React State (状态)

与用户互动,导致状态变化,根据新的 state 重新渲染用户界面(常用于输入框中)

var Input = React.createClass({
  getInitialState: function() {
    return {value: ‘Hello!‘};
  },
  handleChange: function(event) {
    this.setState({value: event.target.value});
  },
  render: function () {
    var value = this.state.value;
    return (
      <div>
        <input type="text" value={value} onChange={this.handleChange} />
        <p>{value}</p>
      </div>
    );
  }
});

ReactDOM.render(<Input/>, document.getElementById(‘example‘));

注:由于 this.props 和 this.state 都用于描述组件的特性,可能会产生混淆。一个简单的区分方法是,this.props 表示那些一旦定义,特性是不再改变的,而 this.state 特性是会随着用户互动而产生变化的。

六、PropTypes 属性

就是用来验证组件实例的属性是否符合要求:有时,我们需要一种机制,验证别人使用组件时,提供的参数是否符合要求(提供给代码人员自己识别)

var data = ‘123‘;

var MyTitle = React.createClass({
  propTypes: {
    title: React.PropTypes.number,
  },

  render: function() {
    return <h1> {this.props.title} </h1>;
  }
});

ReactDOM.render(
  <MyTitle title={data} />,
  document.getElementById(‘example‘)
);

结果:正常输出“123”,打开开发者工具会有一段错误输出(具体可自己试试)

七、refs 属性

组件并不是真实的 DOM 节点,而是存在于内存之中的一种数据结构,叫做虚拟 DOM。只有当它插入文档以后,才会变成真实的 DOM 。根据 React 的设计,所有的 DOM 变动,都先在虚拟 DOM 上发生,然后再将实际发生变动的部分,反映在真实 DOM上,这种算法叫做 DOM diff ,它可以极大提高网页的性能表现。

this.refs[myRefsName] 获取真实的DOM节点

var MyComponent = React.createClass({
  handleClick: function() {
    this.refs.myTextInput.focus();
  },
  render: function() {
    return (
      <div>
        <input type="text" ref="myTextInput" />
        <input type="button" value="点击进行编写" onClick={this.handleClick} />
      </div>
    );
  }  
});

ReactDOM.render(
  <MyComponent />,
  document.getElementById(‘example‘)
);

八、组件的生命周期

组件的生命周期分成三个状态:

  1、Mounting:已插入真实 DOM

  2、Updating:正在被重新渲染

  3、Unmounting:已移出真实 DOM

React 为每个状态都提供了两种处理函数,will 函数在进入状态之前调用,did 函数在进入状态之后调用,三种状态共计五种处理函数 + 两种特殊状态的处理函数;

具体参见:https://facebook.github.io/react/docs/react-component.html

九、React AJAX

React 组件的数据可以通过 componentDidMount 方法中的 Ajax 来获取,当从服务端获取数据库可以将数据存储在 state 中,再用 this.setState 方法重新渲染 UI

当使用异步加载数据时,在组件卸载前使用 componentWillUnmount 来取消未完成的请求。

var UserGist = React.createClass({
  getInitialState: function() {
    return {
      username: ‘‘,
      userhobby: ‘‘
    };
  },
  componentDidMount: function() {
    $.get(this.props.source, function (result) {
       this.setState({
          username: result.name,
          userhobby: result.hobby
        });
      }.bind(this),‘json‘);
  },

  render: function() {
    return (
      <div>
        <p>姓名:{this.state.username} </p>
        <p>爱好:{this.state.userhobby} </p>

      </div>
      );
   }
});

ReactDOM.render(
  <UserGist source="http://localhost/testdata.php" />,
  document.getElementById(‘example‘)
);

时间: 2024-10-27 08:05:24

浅谈 React的相关文章

【转】浅谈React、Flux 与 Redux

本文转自<浅谈React.Flux 与 Redux>,转载请注明出处. React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化 利用 props 形成单向的数据流 根据 state 的变化来更新 view 利用虚拟 DOM 来提升渲染性能 前面说到 React 能够根据 state 的变化来更新 view,一般来说引起 state 变化的动作除了来自外部(如服务器),大部分都来自于页面上的用户活动,那页面上的用户活动怎样对 state 产生作用呢?Reac

浅谈react受控组件与非受控组件

最近在使用蚂蚁金服出品的一条基于react的ant-design UI组件时遇到一个问题,编辑页面时input输入框会展示保存前的数据,但是是用defaultValue就是不起作用,输入框始终为空值而不是具体的传入的值.具体编辑页面中文本框相关的代码如下:         ... //render方法上面的内容省略  <FormItem       label="问题描述:"       hasFeedback      {...props.formItemLayout}  &g

浅谈react

现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站.做出来以后,发现这套东西很好用,就在2013年5月开源了. 今天我想分享一下利用react编写数据流的方法, 那么什么事数据流?为什么要用数据流? 其实

浅谈react的初步试用

现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站.做出来以后,发现这套东西很好用,就在2013年5月开源了. 今天我想分享一下利用react编写数据流的方法, 那么什么事数据流?为什么要用数据流? 其实

浅谈 React、Flux 与 Redux

React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化利用 props 形成单向的数据流根据 state 的变化来更新 view利用虚拟 DOM 来提升渲染性能 前面说到 React 能够根据 state 的变化来更新 view,一般来说引起 state 变化的动作除了来自外部(如服务器),大部分都来自于页面上的用户活动,那页面上的用户活动怎样对 state 产生作用呢?React 中每个组件都有 setState 方法用于改变组件当前的 state,所以可

浅谈React工作原理

Reactjs 起源于Facebook内部项目,是一个用来构建用户界面的 javascript 库,相当于MVC架构中的V层框架,与市面上其他框架不同的是,React 把每一个组件当成了一个状态机,组件内部通过state来维护组件状态的变化,当组件的状态发生变化时,React通过虚拟DOM技术来增量并且高效的更新真实DOM.本文将对React 的这些特点进行简单的介绍. 一个简单的React组件 -- HelloReact  考虑到有的同学还不曾了解过React,我们先来写一个简单的React组

浅谈React前后端同构防止重复渲染

作者:随风溜达的向日葵  什么叫前后端同构? 为了解决某些问题(比如SEO.提升渲染速度等)react 提供了2个方法在服务端生成一个HTML文本格式的字符串.在得到了这个HTML格式的字符串之后,通常会将其组装成一个页面直接返回给用户的浏览器. 到这里,服务端的活已经干完了,然后就是浏览器这边干活. 浏览器拿到HTML文本后,立刻进行渲染将内容呈现给用户.然后加载页面所需的 .js 文件,然后执行 JavaScript 脚本,然后开始初始化 react 组件---- 到这里问题就来了.reac

浅谈React、Vue 部分异步

React中的setState setState为什么需要异步? 无法限制何时使用异步,多次连续使用setState 防止多次渲染,异步rendering不仅仅是性能上的优化,而且这可能是react组件模型在发生的根本性的改变 this.setState({ inputTxt:'' }) console.log(this.state.inputTxt); //立即打印不出inputTxt:'' 如果我们要立即打印出inputTxt的变化需要通过setTimeout打印出来 this.setSta

前端知识 |浅谈React setState

setState的连锁反应 这是一个React组件实现组件可交互所需的流程,render()输出虚拟DOM,虚拟DOM转为DOM,再在DOM上注册事件,事件触发setState()修改数据,在每次调用setState方法时,React会自动执行render方法来更新虚拟DOM,如果组件已经被渲染,那么还会更新DOM中去.这个过程,setState就像一个点燃引擎的火源,发动了React核心的调度层,然后直至渲染层的改变.异步的setState刚接触React的同学,对React的setState