函数式组件初识:先来看一下最简单的一个函数组件。

    1. const User1 = () => {
    2. return (<div>user1...</div>);
    3. }
    4. const User = () => (<div>user...</div>);

    函数式组件属性访问:

    1. const User = (props) => {
    2. return (<div>{props.name}</div>);
    3. }
    4. class App extends Component{
    5. render() {
    6. return (<div>
    7. <User name={'Hello'}/>
    8. </div>);
    9. }
    10. }

    函数式组件状态访问:

    1. let [count, setCount] = useState(0);
    2. let [time, setTime] = useState(100);

    useState的参数是data的初始值,返回一个数组,数组第一项是data的值,第二项是一个函数,用作设置data的值。
    如果有多个数据状态的话,需要多次定义。

    1. import React, { Component, useState, useEffect} from 'react';
    2. import ReactDOM from 'react-dom';
    3. import * as serviceWorker from './serviceWorker';
    4. const User = (props) => {
    5. let [count, setCount] = useState(0);
    6. let [time, setTime] = useState(100);
    7. return (<div>
    8. <div>
    9. <span>{count}</span>
    10. <button onClick={() => setCount(++count)}>+</button>
    11. </div>
    12. <div>
    13. <span>{time}</span>
    14. <button onClick={() => setTime(--time)}>-</button>
    15. </div>
    16. </div>);
    17. }
    18. class App extends Component{
    19. render() {
    20. return (<div>
    21. <User/>
    22. </div>);
    23. }
    24. }

    函数式组件声明周期hook函数:
    函数式组件将didAmout和didUpdate合在了一起; useEffect 函数第一个参数是一个函数,第二个参数是一个数组。

    1. useEffect(() => {
    2. console.log('Hello...');
    3. });

    上面的代码每当有状态数据更新时,都会执行,而且第一次渲染的时候也会输出Hello,是因为函数式组件将DidMount和DidUpdate合在了一起。

    如果只想触发DidMount,不触发DidUpdate,则设置第二个参数为一个空数组。

    1. useEffect(() => {
    2. console.log('Hello...');
    3. }, []);

    shouldComponentUpdate: 如果只想让time改变的时候才会输出Hello,设置第二个参数如下。

    1. useEffect(() => {
    2. console.log('Hello...');
    3. }, [time]);

    函数式组件中WillUnMount的实现:

    return一个函数。

    1. useEffect(() => {
    2. console.log('Hello...');
    3. return () => {
    4. console.log('status clear...');
    5. };
    6. }, []);

    综合示例:

    1. import React, { Component, useState, useEffect} from 'react';
    2. import ReactDOM from 'react-dom';
    3. import * as serviceWorker from './serviceWorker';
    4. const Action = (props) => {
    5. let [value, setValue] = useState('');
    6. let {onAdd} = props;
    7. return (<div>
    8. <input value={value} onChange={(e) => setValue(e.target.value)}/>
    9. <button onClick={(e) => {
    10. if (value !== '') {
    11. onAdd(value);
    12. }
    13. }}>Add</button>
    14. </div>);
    15. }
    16. const TaskList = (props) => {
    17. let {data, onDel} = props;
    18. return (<div>{data.map((item, index) => {
    19. return <div key={index}><span >{index}. {item.name}</span>
    20. <button onClick={(e) => onDel(index)}>Delete</button></div>;
    21. })}</div>);
    22. }
    23. class App extends Component{
    24. constructor(props){
    25. super(props);
    26. this.state = {
    27. data: [
    28. {
    29. name: 'david'
    30. }
    31. ]
    32. };
    33. }
    34. render() {
    35. return (<div>
    36. <Action onAdd={(v) => {
    37. let data = this.state.data;
    38. data.push({
    39. name: v
    40. });
    41. this.setState({
    42. data
    43. });
    44. }}/>
    45. <TaskList data={this.state.data} onDel={(i) => {
    46. let data = this.state.data;
    47. data.splice(i, 1);
    48. this.setState({
    49. data
    50. });
    51. }}/>
    52. </div>);
    53. }
    54. }
    55. ReactDOM.render(<App />, document.getElementById('root'));
    56. serviceWorker.unregister();

    自定义Hook:可以将公共的功能抽象出来。
    自定义hook必须以use开头。

    1. import React, { Component, useState, useEffect} from 'react';
    2. import ReactDOM from 'react-dom';
    3. import * as serviceWorker from './serviceWorker';
    4. const useTitleHook = (title) => {
    5. useEffect(() => {
    6. document.title = title;
    7. return ()=>{
    8. document.title = 'APX';
    9. };
    10. });
    11. }
    12. const App = () => {
    13. let [title, setTitle] = useState('APX');
    14. useTitleHook(title);
    15. return (<div>
    16. <input value={title} onChange={e => setTitle(e.target.value)}/>
    17. </div>);
    18. }
    19. ReactDOM.render(<App />, document.getElementById('root'));
    20. serviceWorker.unregister();