React基礎篇-初始
阿新 • • 發佈:2019-01-10
1.概念
用於構建使用者介面的 JavaScript 庫。
2.特點
1、宣告式:React 可以非常輕鬆地建立使用者互動介面。為你應用的每一個狀態設計簡潔的檢視,在資料改變時 React 也可以高效地更新渲染介面。以宣告式編寫UI,可以讓你的程式碼更加可靠,且方便除錯。
2、元件化:建立好擁有各自狀態的元件,再由元件構成更加複雜的介面。無需再用模版程式碼,通過使用JavaScript編寫的元件你可以更好地傳遞資料,將應用狀態和DOM拆分開來。
3、可用性:無論你現在正在使用什麼技術棧,你都可以隨時引入 React 開發新特性。React 也可以用作開發原生應用的框架React Native。
3.特性
1、元件:React 元件使用一個名為 render()
的方法, 接收資料作為輸入,輸出頁面中對應展示的內容。 下面這個示例中類似XML的寫法被稱為JSX. 輸入的資料通過 this.props(外部傳入)
傳入 render()
方法。
class HelloMessage extends React.Component { //定義元件HelloMessage render() { //render函式返回需掛載DOM,JSX寫法 return ( <div> Hello {this.props.name} //props為父級傳遞到子級的值,不可反向 </div> ); } } ReactDOM.render( //使用元件定義的DOM,初始化 <HelloMessage name="yjs" />, document.getElementById("app") //元件DOM掛載的位置,一般使用ID ); ——————————————————————————————————————————————————————————————————————————————————————————— 輸出: <div id="app"> <div>Hellow yjs</div> </div>
2、狀態:除了使用外部傳入的資料以外 (this.props
), 元件還可以擁有其內部的狀態資料 (this.state
)。 當元件的狀態資料改變時, 元件會呼叫 render()
方法重新渲染。
class StateChange extends React.Component { constructor(props) { //定義構造器,在此定義繼承props;初始state;事件函式繫結 super(props); //繼承props this.state = { seconds: 0 }; //初始化state(可以理解成一個物件變數) } tick() { //函式定義 this.setState(prevState => ({ //setState()來改變state的值,然後重新渲染 seconds: prevState.seconds + 1 //定時器中state的變化 })); } componentDidMount() { //生命週期函式-第一次渲染掛載成功後呼叫(客戶端) this.interval = setInterval(() => this.tick(), 1000); } componentWillUnmount() { //生命週期函式-元件從 DOM 中移除之前立刻被呼叫 clearInterval(this.interval); } render() { return ( <div> Seconds: {this.state.seconds} //this.state.seconds在state變更時會隨之變化 </div> ); } } ReactDOM.render( <StateChange />, document.getElementById("app") ); ——————————————————————————————————————————————————————————————————————————————————————————— 輸出: <div id="app"> Seconds:0 //在這顯示完以後,就會走生命週期的定時器,1000ms加一次 </div>
3、應用:使用 props
和 state
, 我們可以建立一個簡易的應用。 下面這個示例中,我們使用 state
來儲存;使用內聯的方法添加了事件處理函式,它們將通過事件代理被收集和呼叫。
class TodoApp extends React.Component {
constructor(props) {
super(props);
this.state = { items: [], text: '' };
this.handleChange = this.handleChange.bind(this); //繫結函式到構造器,方便呼叫
this.handleSubmit = this.handleSubmit.bind(this);
}
render() {
return (
<div>
<h3>TODO</h3>
<TodoList items={this.state.items} /> //元件:ul-li列表,將列表集合item傳遞
<form onSubmit={this.handleSubmit}> //form表單提交,觸發handleSubmit函式
<input
onChange={this.handleChange} //input輸入框,輸入改變改變state的text
value={this.state.text}
/>
<button>
新增第 {this.state.items.length + 1} 條 //使用儲存在state的所有新增項
</button>
</form>
</div>
);
}
handleChange(e) {
this.setState({ text: e.target.value });
}
handleSubmit(e) {
e.preventDefault(); //取消提交的預設事件
if (!this.state.text.length) { //輸入框未輸入,什麼都不幹
return;
}
const newItem = {
text: this.state.text,
id: Date.now()
};
this.setState(prevState => ({
items: prevState.items.concat(newItem), //state-item新增新的項
text: ''
}));
}
}
class TodoList extends React.Component {
render() {
return (
<ul>
{this.props.items.map(item => ( //map()方法,遍歷父級的props渲染<li>
<li key={item.id}>{item.text}</li>
))}
</ul>
);
}
}
ReactDOM.render(<TodoApp />, mountNode);
4、第三方框架||庫:React 的使用非常靈活,並且提供了可以呼叫其他第三方框架或庫的介面,以下為我接觸的元件庫。
1、bootstrap元件庫-react-bootstrap
下載:npm install react-bootstrap --save
index引用:import 'bootstrap/dist/css/bootstrap.min.css';
引入:import { Navbar, Button } from 'react-bootstrap';
2、螞蟻金服元件庫-AlipayUI
下載:npm install antd-mobile --save
引入:import { Button } from 'antd-mobile';
使用:ReactDOM.render(<Button>按鈕</Button>, mountNode);