• 前端-【学习心得】-react3 响应状态


    目前为止,每一个组件渲染数据的时候使用props,props作为组件内部属性是不可以改变的,因为props是从父组件传递过来,并被父组件所拥有。而子组件实际上是依赖父组件的环境中得到这个props。

         下面介绍可以改变的属性state,用来实现组件的交互,这个属性对组件自身来说是私有的,可以通过this.setState()来改变,一旦这个属性改变后,组件会自动重新渲染。

         state理解为传递数据的内部属性,用来向render传递数据。

         当从服务器上抓取数据后,我们会改变接口中的数据。在此可以先定义一个data的数组作为state的初始化参数。

     // tutorial12.js

    var CommentBox = React.createClass({

         getInitialState: function() {      return {data: []};      },      render: function() { 

         return ( <div className="commentBox"> <h1>Comments</h1>      <CommentList data={this.state.data} />      <CommentForm /> </div> ); 

    }

    });

         初始化状态的时候拿到数据,并作为state的属性,在render的时候调用state的该属性

         

     

    // tutorial13.js

    var CommentBox = React.createClass(

    { getInitialState: function() { return {data: []}; },     componentDidMount: function() {           $.ajax({            url: this.props.url,            dataType: 'json',           success: function(data) {           this.setState({data: data});           }.bind(this),           error: function(xhr, status, err) {            console.error(this.props.url, status, err.toString());      }.bind(this)      });      }, render: function() { 

         return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.state.data} /> <CommentForm /> </div> ); }

    });

    当组件第一次被创建的时候,我们希望从服务器GET一些json数据,然后更新state。这样数据渲染就会被立刻更新了。

     

    接下来我们先顶一个一个静态的json文件放在服务器上,内容如下:

    tutorial13.json

    [ {"author": "Pete Hunt", "text": "This is one comment"}, {"author": "Jordan Walke", "text": "This is *another* comment"}]

     

    然后我们用熟悉的jquery 获取这些数据

    // tutorial13.jsvar CommentBox = React.createClass({ getInitialState: function() { return {data: []}; }, componentDidMount: function() {     $.ajax({     url: this.props.url,     dataType: 'json',     success: function(data) {     this.setState({data: data});     }.bind(this),     error: function(xhr, status, err) {     console.error(this.props.url, status, err.toString());     }.bind(this)     });}, render: function() { 

         return ( 

              <div className="commentBox"> 

                   <h1>Comments</h1> 

                   <CommentList data={this.state.data} />

                    <CommentForm /> 

              </div> ); 

         }});

     

    在这里componentDidMount方法会在react渲染的时候自动调用然后更新state里的data,一旦state改变,react渲染也开始改变,旧的数据就被更新了。这里可以考虑使用websocket,不需要自己写渲染dom的部分,数据更新后自动就渲染了。这个倒是挺方便。

    // tutorial14.js

    var CommentBox = React.createClass({      loadCommentsFromServer: function() {           $.ajax(

                   { 

                        url: this.props.url,

                        dataType: 'json', 

                        success: function(data) { 

                        this.setState({data: data}); }.bind(this),

                        error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); },

                        getInitialState: function() { return {data: []}; },

                        componentDidMount: function() {                          this.loadCommentsFromServer();                          setInterval(this.loadCommentsFromServer, this.props.pollInterval);                }, 

              getInitialState: function() { return {data: []}; }, componentDidMount: function() {

              this.loadCommentsFromServer();           setInterval(this.loadCommentsFromServer, this.props.pollInterval);       },

         render: function() { 

              return ( 

              <div className="commentBox">

              <h1>Comments</h1>

              <CommentList data={this.state.data} /> <CommentForm />

              </div> ); }

         }); 

         React.render(           <CommentBox url="comments.json" pollInterval={2000} />,           document.getElementById('content'));

         每隔两分钟访问后台获取数据,这个可以作为数据展示的实现。

         可以考虑后台定时更新数据后写入记录文件,界面访问记录文件即可,无需在为之创建后台调用数据库之类的。

  • 相关阅读:
    下面这段java的源代码的意思
    Swing高级JInternalFrameTest内部窗体
    (转)为什么水平滚动条显示不了
    创建主窗体(转)
    javax.swing.JOptionPane.showMessageDialog() 方法
    Java图形界面设计
    java 做项目时遇到的一些问题
    selectmethod=cursor的含义及其使用
    java.sql.SQLException: No suitable driver found for jdbc:microsoft:sqlserver://localhost:1433;
    10.24
  • 原文地址:https://www.cnblogs.com/wq123/p/4396436.html
Copyright © 2020-2023  润新知