React组件学习(三)

函数组件

  • 代码示例
const Hello = (props)=>{
    return <div>{props.msg}</div>
}
const Hello = props=> <div>{props.msg}</div>
function Hello(props){
    return <div>{props.msg}</div>
}

函数组件代替class组件

面临两个问题

  • 函数组件没有state
  • 函数组件没有生命周期

没有state

  • React v16.8.0推出了Hooks API
  • 其中有一个API叫做useState可以解决这个问题
  • 代码示例
const React = window.React;
const ReactDOM = window.ReactDOM;
//类方式实现
class App extends React.Component{
    constructor(props){
        super(props);
        this.state = {n:1};
    }
    onClick=()=>{
        this.setState(state=>({
            n:state.n+1
        }))
    }
    render(){
        return <div>
            {this.state.n}
            <button onClick={this.onClick}>+1</button>
        </div>
    }
}
//函数方式实现,可以看出函数方式更简洁明了
const App = props =>{
    const [n,setN] = React.useState(0);
    const onClick = ()=>{
        setN(n+1);
    }
    return <div>
        {n}
        <button onClick={onClick}>+1</button>
    </div>
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App/>,rootElement);

没有生命周期

    • React v16.8.0推出了Hooks API
    • 其中有一个API叫做useEffect可以解决这个问题
      在这里插入图片描述
const React = window.React;
const ReactDOM = window.ReactDOM;

const App = props =>{
    const [n,setN] = React.useState(0);
    const onClick = ()=>{
        setN(n+1);
    }
    //模拟componentDidMount
    // React.useEffect(()=>{
    //     console.log("use Effect");
    // },[])
    //模拟componentDidUpdate
    // React.useEffect(()=>{
    //     console.log("use Effect");
    // },[n])
    
    React.useEffect(()=>{
        console.log("use Effect");
    },[n])
    return <div>
        {n}
        <button onClick={onClick}>+1</button>
    </div>
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App/>,rootElement);
const React = window.React;
const ReactDOM = window.ReactDOM;
const Child =(props)=>{
    //模拟componentWillUnmount
    React.useEffect(()=>{
        console.log("use Effect");
        return ()=>{
            console.log("销毁了");
        }
    })
    return (
        <div>Child</div>
    )
}
const App = props =>{
    const [childVisible,setChildVisible] = React.useState(true);
    const hide =()=>{
        setChildVisible(false);
    }
    const show = ()=>{
        setChildVisible(true);
    }
    return (<div>
        {childVisible ?  <button onClick={hide}>hide</button>:<button onClick={show}>show</button>}
        {childVisible ?  <Child />: null}
    </div>)
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App/>,rootElement);

在这里插入图片描述

自定义 Hook 之 useUpdate

const React = window.React;
const ReactDOM = window.ReactDOM;
const useUpdate = (fn,array)=>{
    const [count,setCount] = React.useState(0);
     React.useEffect(()=>{
        setCount(x => x+1)
    },[...array])
    //模拟componentDidMount
    React.useEffect(()=>{
        if(count > 1){
            fn()
        }
    },[count,fn])
}
const App = props =>{
    const [n,setN] = React.useState(0);
    const onClick = ()=>{
        setN(n+1);
    }
    useUpdate(()=>{
        console.log("变了")
    },[n])
    return <div>
        {n}
        <button onClick={onClick}>+1</button>
    </div>
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App/>,rootElement);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaobangsky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值