以前我們是直接操作dom的形式,而react的設計思想完全不同,react是一個響應式框架。react強調我們不要直接操作dom,我們操作的是數據,通過數據的變化,react會感知到數據的變化,自動的幫我們生成dom。因此,我們在寫代碼的時候,再也不用關注dom相關的操作,只需要關注數據層的就可以了。
下面定義了一個TodoList 組件
import React, {Component, Fragment} from 'react'; class TodoList extends Component { constructor(props) { super(props); this.state = { inputValue: 'hello', list: [] }; } render() { return ( <Fragment> <div> <input value={this.state.inputValue} onChange={this.handleInputChange.bind(this)} /> <button>提交</button> </div> <ul> <li>學習英語</li> <li>學習數學</li> </ul> </Fragment> ); } handleInputChange(e) { this.setState({ inputValue: e.target.value }); } } export default TodoList;
在 App.js 中引入TodoList 組件
import React,{Component} from 'react'; import TodoList from './TodoList'; class App extends Component { render(){ return ( <div> <TodoList /> </div> ); } } export default App;
1. 在react 中如何定義數據呢?TodoList 這個組件,也是一個類,在 js 里面,一個類就一定會有一個 constructor 構造函數。當我們使用這個組件時, constructor是優於其他任何函數最先被執行的一個函數。react里面定義數據,我們需要把數據定義在狀態里。this.state 就是這個組件的狀態,這個狀態里面可以存很多東西。
2. 調用父類的構造函數,super(props); 這是固定寫法,也就是TodoList繼承了的React中的Component組件,所以要在創建TodoList的時候,調用父類構造函數一次。
3. 我們把input里的value與狀態里的inputValue相關聯,如果狀態里的inputValue值變了,react會自動感知到,然后賦值給value。接着,我們需要給input綁定一些事件,比如onChange 去監聽其變化。onChange 會接收一個事件對象e, 通過e.target.value 獲取到要輸入的內容。將要輸入的內容賦值給狀態里的inputValue,inputValue值發生改變,react 自動將inputValue值賦值給value。調用函數,需要用bind函數來改變this指向
4. 怎樣改變 state 中的 inputValue 的值呢?首先要記住,不能通過this.state.inputValue = e.target.value 這種方式去改變它的值。react 給每個組件都提供了一個setState方法。