欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

React

程序员文章站 2024-03-25 14:38:58
...

参考资料:

React 官网
阮一峰教程
菜鸟教程
React 初识
===
React 是一个用于构建用户界面的 JAVASCRIPT 库。
主要用于构建UI, 是 MVC** (模型(model)-用户界面(view)-控制器(controller))**中的 V(用户界面)。

JSX

React 使用JSX语法,它允许HTML与javascript混写。
遇到 HTML 标签(以 < 开头),就用 HTML 规则解析;
遇到代码块(以 { 开头),就用 JavaScript 规则解析。

  <h1> {this.props.title} </h1>

ReactDOM.render()

该方法是React的基本法,它可以将模板(下面的element以及component)转为HTML语言,再插入到指定的DOM中。
Element (元素)
===
描述的是你希望在屏幕中显示的内容

  const element=<h1> hello world </h1>;
  ReactDom.render(
    element,
    document.getElementById('root')
  )

我们可以将该元素传递给DOM节点,通过ReactDOM.render()

React element 是不可改变的,在它创建了之后,它的属性,子元素都不能改变。如果非要改,就只能重新创建一个新的元素。

  function tick(){
    const element = (
            <div>
                 <h2>It is {new Date().toLocaleTimeString()}.</h2> 
            </div>
         );
  ReactDOM.render(
            element,
            document.getElementById('root')
        );
  }
  {/*每一次执行setInterval都会创建一个新的元素*/}
  setInterval(tick, 1000);

Components and Props(组件和属性)

组件可以把UI(用户界面)分成许多独立的小块来单独考虑。
它可以接收任意形式的输入和 返回一个React element

定义一个组件有两种方式 (从React 角度来看这两种方法是相同的)

  function Welcome(props){
      return <h1>Hello, {props.name}</h1>;
    }  {/*js的函数形式*/}

  class Welcome extends React.Component{
    render(){
            return <h1>Hello, {this.props.name}</h1>;
          }
    }   {/*ES6中的类来定义*/}

  const element = <Welcome name="Sara" />;
  ReactDOM.render(
        element,
        document.getElementById('root')
    );

注意:
组件的名字只能用大写字母开头,否则会报错
组件类只能包含一个顶层标签,否则也会报错。

比如定义多个组件

  function App () {
        return (
                <div>
                      <Welcome name="Sara" />
                      <Welcome name="Cahal" />
                      <Welcome name="Edite" />
                </div>
            );
    }

    ReactDOM.render(
          <App />
          document.getElementById('root')
      );

组件必须返回一个单一的根元素,所以我们用一个<div>元素来包含所有的 <Welcome /> element ,否则会报错。
在返回的根元素中(比如上面的<div >),我们可以尽可能将有联系的部分合成一个组件。

注意:
定义一个function内的函数不能改变它的输入,比如下面第一种可以第二种不行。

  function sum(a, b) {
       return a + b;
      }
  function withdraw(account, amount) { 
    account.total -= amount;
      }

State and Lifecycle(状态和生命周期)

在一开始时说“React element在一旦创建了之后,它的属性,子元素都不能改变。如果非要改,就只能重新创建一个新的元素。”所以每一次时间改变都要重新把element传递给DOM。但实际上,大多数React只执行一次 ReactDOM.render() ,所以引入State 。

React把组件看做是状态机,一开始有一个初始的State。通过与用户的交互导致State改变后,自动调用组件内的this.render 方法,再次渲染组件。

  var LikeButton = React.createclass({
      getInitialState:function()  {
          return {liked:false};
       },
      
      handleClick: function (event)  {
          this.setState({liked:!this.state.liked});
      }
    
      render: function()  {
          var text = this.State.liked ?"like" : "unliked";
          retuen  (
              <p onClick={this.handleClick}>
                  你<b>{text}</b>我。点我切换状态。
              </p>
          );
      }
  });

 ReactDOM.rennder(
    <LikeButton />,
    document.getElementById('root') 
  );

注意:
设置State的只能使用setState({comment: 'Hello'}); 方法

实现组件的生命周期
组件的周期分为三个状态
* Mounting 已插入真实DOM
* Updating 正在被重新渲染
* Unmounting 已移出真实DOM
React为每个状态都提供了两种处理函数,will函数在进入状态前调用,did函数在进入状态之后调用。共计五种:
* componentWillMount ()
* componentDidMount ()
* componentWillUpdate(object nextProps, object nextState)
* componentDidUpdate(object prevProps, object prevState)
* componentWillUnmount()

比如,我们当一个组件在一开始提交到DOM时可以设置一个不断更新State的计时器(timer)

  componentDidMount()  {
      this.timerID = setInterval( 
      () => this.tick(), 
      1000 
      );
  }

当该组件从DOM中移除时可以清除这一个定时器

  componentWillUnmount() {
      clearInterval(this.timerID);
  }