首页 > 其他分享 >React中的函数组件详解

React中的函数组件详解

时间:2022-12-04 23:56:51浏览次数:54  
标签:const React 详解 useState props 组件 return useEffect

转载来自

(47条消息) React中的函数组件详解_『荼』的博客-CSDN博客_react 函数组件

1. 创建方式

 //  写法一
const Hello = (props) => {      
    return <div>{props.message}</div>
}

 //  写法二
const Hello = props => <div>{props.message}</div>  

// 写法三
function Hello(props) {
    return <div>{props.message}</div>
}

2. 函数组件代替类组件
面临的问题

函数组件没有state => React v16.8.0推出Hooks API,其中的一个API叫做useState可以解决问题
函数组件没有生命周期 => React v16.8.0推出Hooks API,其中的一个API叫做useEffect可以解决问题
我们对比一下两种组件实现 n + 1 的例子

类组件

class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            n: 0
        }
    }

    addNum = () => {
        this.setState({n: this.state.n + 1})
    }

    render() {
        return (
            <div className='App'>
                <span>n:{this.state.n}</span>
                <button onClick={this.addNum}>n+1</button>
            </div>
        )
    }
}

 

函数组件

const App = props => {
    const [n,setN] = React.useState(0)
    function addNum(){
        setN(n + 1)
    }
    return (
        <div className='App'>
            {n}
            <button onClick={addNum}>+1</button>
        </div>
    )
}

相比之下函数组件更为简洁一些

使用 useEffect 解决生命周期问题

  1. 模拟 componentDidMount 首次渲染
    useEffect(() => {     //  模拟componentDidMount  首次渲染
            console.log('use effect')
        },[])    // 空数组必须写
  2. 模拟 componentDidUpdate
    const [n, setN] = React.useState(0)
    useEffect(() => {     //  模拟  componentDidUpdate 
            console.log('n 变化了')
        },[n])  // 数组里面可以写多个参数表示监听多个变量
    
    useEffect(() => {     //  模拟  componentDidUpdate 
            console.log('任意属性变更了')
        })  // 不写数组表示监听所有 useState  的变量
    //  但是这样在第一次渲染时也会触发函数的执行  
     解决方法使用自定义Hook 见下一标题
  3. 模拟componentWillUnmount
      useEffect(() => {    
            return () => {
                console.log('Child 销毁了')
            }
        })    //  返回一个函数 在销毁时执行
      1. constructor
        函数组件执行的时候,就相当于constructor

      2. shouldComponentUpdate
        后面的 React.memo和useMemo可以解决

      3. render
        函数组件的返回值就是render的返回值.

    //  模拟render里面写逻辑
    const X = (props) => {
        console.log('我是要写的逻辑')
        return (
            <div>逻辑模拟</div>
        )
    }
    
    const App = props => {
        let [childVisible, setChildVisible] = useState(true)
    
        const changeVisible = () => {
            setChildVisible(!childVisible)
        }
    
        return (
            <div className='App'>
                {childVisible ? <button onClick={changeVisible}>{childVisible}</button> :
                    <button onClick={changeVisible}>hide</button>}
                {/*{childVisible ? <Child/> : null}*/}
                <Child/>
                <X/>     
            </div>
        )
    }   // 一个函数便是一个组件

    3. 自定义 Hook 之 useUpdate
    解决上面 n 值初次渲染就执行的问题

    const App = props => {
        const [n, setN] = useState(0)
        const onClick = () => {
            setN(n + 1)
        }
        const [nUpdateCount, setNUpdateCount] = useState(0)
        useEffect(() => {    // 初次渲染就执行 + 1
            setNUpdateCount(nUpdateCount + 1)
        }, [n])
        useEffect(() => {    // 初次渲染就执行 判断是否大于1 
            if(nUpdateCount > 1){
                console.log('n变了')
            }
        },[nUpdateCount])
        return (
            <div className='App'>
                n值变成了:{n}
                <button onClick={onClick}>n+1</button>
            </div>
        )
    }
    //  通过使用两次 useEffect 第一个触发第二个 useEffect 函数计数,大于0便是n值变化了

    上面的代码很乱 改进一下

    const useX = (fn, dep) => {   // 这就是自定义 Hook 这就可以抽离成别的文件
        const [count, setCount] = useState(0)
        useEffect(() => {
            setCount(x => x + 1)
        }, [dep])
        useEffect(() => {
            if (count > 1) {
                fn()
            }
        }, [count,fn])
    }
    
    const App = props => {
        const [n, setN] = useState(0)
        const onClick = () => {
            setN(n + 1)
        }
        useX(() => {
            console.log('n 变化了')
        }, n)
        return (
            <div className='App'>
                n值变成了:{n}
                <button onClick={onClick}>n+1</button>
            </div>
        )
    }

     

     


标签:const,React,详解,useState,props,组件,return,useEffect
From: https://www.cnblogs.com/sexintercourse/p/16951241.html

相关文章

  • 转 Vue生命周期函数详解
     https://blog.csdn.net/wen110898/article/details/120520844?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-......
  • JS中的 || 与 && 运算符详解
    1、JS中的||符号:运算方法:只要“||”前面为false,不管“||”后面是true还是false,都返回“||”后面的值。只要“||”前面为true,不管“||”后面是true还是false,都......
  • Vue 中组件的局部css样式配置:scoped样式
    Vue中组件的局部css样式配置:scoped样式1:说明:<!--##scoped样式1.作用:让样式在局部生效,防止冲突。2.写法:```<stylescoped>```-->2:代码结构3:代码内容index.html<!......
  • 非父子组件之间的三种传值办法
     Vue非父子组件传值https://blog.csdn.net/qq_49867247/article/details/123493323Miraclesir已于2022-03-1510:46:08修改2643收藏7文章标签:vue.jsjavascrip......
  • Service详解
    Service详解Service介绍在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行......
  • 详解蓝牙模块的分类
     摘要:蓝牙模块,是一种集成蓝牙功能的PCBA板,用于短距离无线通讯,蓝牙模块将芯片和外围硬件电路集成到一个PCB上,开发出所需的内置程序实现蓝牙功能的设备。可以通过相关接口和......
  • 转 vue中的双向数据绑定详解 的解释
    vue中的双向数据绑定详解 https://www.cnblogs.com/zhuzhenwei918/p/7309604.html 前言什么是数据双向绑定? vue是一个mvvm框架,即数据双向绑定,即当数据发生......
  • 4.指针和引用的区别详解
    前言指针和引用在形式上很好区别,在C++中相比于指针我们更喜欢使用引用,但是它们的使用场景又极其类似,它们都能直接引用对象,对对象进行处理,那么究竟为什么会引入引用?什么时......
  • 详解用BitBlt实现透明贴图
    效果:代码:structBitmapInDC{HDCm_hdc;HBITMAPm_hbmp;HGDIOBJm_hbmpOld;BitmapInDC(HDChdc,HBITMAPbmp){m_hdc=CreateCompatibleDC(hdc);......
  • 9.【C语言详解】指针
    指针是什么指针是什么?指针理解的2个要点:指针是内存中一个最小单元的编号,也就是地址;平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量;指针就是地址,......