React學習筆記

API的查詢

[https://facebook.github.io/react/docs/top-level-api.html]


學習主要來自於ruanyifeng老師的demo

[https://github.com/ruanyf/react-demos]


DEMO1

使用React需要調用:

<script src="../build/react.js"></script>
<script src="../build/react-dom.js"></script>
<script src="../build/browser.min.js"></script>

另外如果使用React,script的type比較特殊:

<script type="text/babel">

想要進行DOM操作的時候,使用:

ReactDOM.render(a,b)

其中第一個參數是想要輸入的HTML文件,第二個參數是DOM的element選中的操作比如:(這個時候其實使用的是JSX)

ReactDOM.render(
  <h1>Hello, world!</h1>,
  document.getElementById('example')
);

DEMO2:

怎麼在render的第一個參數中使用javascript?

<>告訴程序是‘我在使用HTML’的標籤。

其中如果使用{} 則會被解析爲源生javascript

    <script type="text/babel">
      var names = ['Alice', 'Emily', 'Kate'];

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

DEMO3:

如果var是一個數組,使用ReactDOM.render的時候,數組會被合併,例如:

<script type="text/babel">
  var names = ['Alice', 'Emily', 'Kate'];

  ReactDOM.render(
    <div>
    Hello, {name}!
    </div>,
    document.getElementById('example')
  );
</script>

上面這個例子,輸出就會變成 Hello,AliceEmilyKate

DEMO4:

<script type="text/babel">
  var HelloMessage = React.createClass({
    render: function() {
      return <h1>Hello {this.props.name}</h1>;
    }
  });

  ReactDOM.render(
    <HelloMessage name="John" />,
    document.getElementById('example')
  );
</script>

把function壓入到tag裏面 (6666666666的思想)

利用React.createClass創建了一個名爲HelloMessage的tag然後將這個tag所代表的function寫在render裏面。老節奏,render: function裏面的代碼用 {}包起來。到了ReactDOM.render的時候,讀到HelloMessage的tag會去調用這個function,然後這個function返回真正需要的h1來放到DOM裏面。
另外需要HelloMessage這種通過React.createClass的component需要用大寫字母開頭,不然會報錯。還有如果React.createClass中, render出來的components擁有多個平級的tag, 要用一個總tag把他們包起來,

比如

var HelloMessage = React.createClass({
  render: function() {
    return <div>
       <h1>sdfsdfsdf</h1>
       <p>sdfsdfsdf</p>
    </div>

不然會出問題的!

DEMO5:

<script type="text/babel">
  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>hello</span>
      <span>world</span>
    </NotesList>,
    document.getElementById('example')
  );
</script>

使用React.createClass創建一個名爲NodesList的tag, 使用createClass中的render方法將一個function壓入這個tag中,這個function返回的東西是一個ol,ol中的內容是利用React.Children.map方法將NodesList中的children分別變成li的內容。
其中需要注意的是dom樹的結構實際爲:

<ol>
    <li><span>hello</span></li>
    <li><span>world</span></li>
</ol>        

DEMO6:

關於

   <script type="text/babel">
      var data = 123;
      var MyTitle = React.createClass({
        propTypes: {
          title: React.PropTypes.string.isRequired,
        },
        render: function() {
          return <h1> {this.props.title} </h1>;
        }
      });
      ReactDOM.render(
        <MyTitle title={data} />,
        document.getElementById('example')
      );

    </script>

在使用React.createClass的時候,除了render還有propTypes這個屬性,這個屬性爲title這個tag設置了一個需要被輸入的attribute,而且利用其中的

React.PropTypes.string.isRequired,

還說明了所需數據的數據類型是string,而且是必須需要的,如果沒有給出這個值或者給出的值不是我所需要的類型,就會報錯。
另外,可以使用getDefaultProps這個屬性爲React.createClass添加default值,例如:

var MyTitle = React.createClass({
  getDefaultProps : function () {
    return {
      title : 'Hello World'
    };
  },
  render: function() {
     return <h1> {this.props.title} </h1>;
   }
});

DEMO7

<script type="text/babel">
var MyComponent = React.createClass({
  handleClick: function() {
    this.refs.myTextInput.focus();
  },
  render: function() {
    return (
      <div>
        <input type="text" ref="myTextInput" />
        <input type="button" value="Focus the text input" onClick={this.handleClick} />
      </div>
    );
  }
});
ReactDOM.render(
  <MyComponent />,
  document.getElementById('example')
);
</script>

其中那個ref是用來在MyComponent中尋找帶有ref標籤並且refmyTextInput的node.

DEMO8

利用this.state可以來確定當前component的狀態,(所以把component可以看做一個狀態機?)其中還有比較重要的API的包括:setState(),getInitialState()。

  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' : 'haven\'t liked';
      return (
        <p onClick={this.handleClick}>
          You {text} this. Click to toggle.
        </p>
      );
    }
  });

  ReactDOM.render(
    <LikeButton />,
    document.getElementById('example')
  ); 

另外like這個狀態其實並沒有聲明,但是可以直接用。

DEMO9
隨時變化:

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')
);

狀態機的狀態爲不同的值,每當有變化的時候就產生state的變化。監聽變化事件用的是handleChange: function(event) {},

DEMO10

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章