函数式组件初识:先来看一下最简单的一个函数组件。
const User1 = () => {return (<div>user1...</div>);}const User = () => (<div>user...</div>);
函数式组件属性访问:
const User = (props) => {return (<div>{props.name}</div>);}class App extends Component{render() {return (<div><User name={'Hello'}/></div>);}}
函数式组件状态访问:
let [count, setCount] = useState(0);let [time, setTime] = useState(100);
useState的参数是data的初始值,返回一个数组,数组第一项是data的值,第二项是一个函数,用作设置data的值。
如果有多个数据状态的话,需要多次定义。
import React, { Component, useState, useEffect} from 'react';import ReactDOM from 'react-dom';import * as serviceWorker from './serviceWorker';const User = (props) => {let [count, setCount] = useState(0);let [time, setTime] = useState(100);return (<div><div><span>{count}</span><button onClick={() => setCount(++count)}>+</button></div><div><span>{time}</span><button onClick={() => setTime(--time)}>-</button></div></div>);}class App extends Component{render() {return (<div><User/></div>);}}
函数式组件声明周期hook函数:
函数式组件将didAmout和didUpdate合在了一起; useEffect 函数第一个参数是一个函数,第二个参数是一个数组。
useEffect(() => {console.log('Hello...');});
上面的代码每当有状态数据更新时,都会执行,而且第一次渲染的时候也会输出Hello,是因为函数式组件将DidMount和DidUpdate合在了一起。
如果只想触发DidMount,不触发DidUpdate,则设置第二个参数为一个空数组。
useEffect(() => {console.log('Hello...');}, []);
shouldComponentUpdate: 如果只想让time改变的时候才会输出Hello,设置第二个参数如下。
useEffect(() => {console.log('Hello...');}, [time]);
函数式组件中WillUnMount的实现:
return一个函数。
useEffect(() => {console.log('Hello...');return () => {console.log('status clear...');};}, []);
综合示例:
import React, { Component, useState, useEffect} from 'react';import ReactDOM from 'react-dom';import * as serviceWorker from './serviceWorker';const Action = (props) => {let [value, setValue] = useState('');let {onAdd} = props;return (<div><input value={value} onChange={(e) => setValue(e.target.value)}/><button onClick={(e) => {if (value !== '') {onAdd(value);}}}>Add</button></div>);}const TaskList = (props) => {let {data, onDel} = props;return (<div>{data.map((item, index) => {return <div key={index}><span >{index}. {item.name}</span><button onClick={(e) => onDel(index)}>Delete</button></div>;})}</div>);}class App extends Component{constructor(props){super(props);this.state = {data: [{name: 'david'}]};}render() {return (<div><Action onAdd={(v) => {let data = this.state.data;data.push({name: v});this.setState({data});}}/><TaskList data={this.state.data} onDel={(i) => {let data = this.state.data;data.splice(i, 1);this.setState({data});}}/></div>);}}ReactDOM.render(<App />, document.getElementById('root'));serviceWorker.unregister();
自定义Hook:可以将公共的功能抽象出来。
自定义hook必须以use开头。
import React, { Component, useState, useEffect} from 'react';import ReactDOM from 'react-dom';import * as serviceWorker from './serviceWorker';const useTitleHook = (title) => {useEffect(() => {document.title = title;return ()=>{document.title = 'APX';};});}const App = () => {let [title, setTitle] = useState('APX');useTitleHook(title);return (<div><input value={title} onChange={e => setTitle(e.target.value)}/></div>);}ReactDOM.render(<App />, document.getElementById('root'));serviceWorker.unregister();
