- 创建方式
- 函数组件的state
- 函数组件的生命周期
1. 创建方式
import React from "react"
//箭头函数创建
const Hello = (props)=>{
return (
<div>{props.name}</div>
)
};
// 简写
const Hello = props => <div>{props.name}</div>
//普通函数创建
function Hello (props){
return <div>{props.name}</div>
}
2.函数组件的state
- 函数组件中没有state,没有生命周期
- REact V16.8 解决方案 Hooks API 的 useSatte 可以解决
const [n.setN] = React.useState(0);
setN(n+1)
上面的代码中setN永远不会更新n,他会生成一个新的n
3. 函数组件的生命周期
- 生命中期用 Hooks API的useEffect 可以解决
- 可以用来解决副作用问题 -只在第一次渲染的时候调用
import React,{useState} from "react"
//箭头函数创建
const Hello = (props)=>{
const [n,setN] = useState(0);
const onClick=()=>{setN(n+1)};
//首次渲染执行一次
useEffect(()=>{
console.log("渲染了")
},[]);
//n变化了就执行
useEffect(()=>{
console.log("n update")
},[n]);
//销毁的时候执行
useEffect(()=>{
return ()=>{
console.log("要销毁了")
}
})
return (
<div>
{n}
<button onClick={onClick}>add</button>
</div>
)
};
模仿componentDidUpdate中的问题
function App (){
const [n,setN] = useState(0)
const add = ()=>{
setN(n+1)
};
useEffect(()=>{
console.log("n的值变化了")
},[n])
return (
<div>
{n}
<button onClick={this.add}>add</button>
</div>
)
}
上面的监听在页面初始化的时候也会被监听到,原理是n有初始的undefind变成了0;解决这个问题需要重新自定义一下useEffect;代码如下
import React,{useState,useEffect} from "react"
//自定义useEffect实现componentDidUpdate
const useUpdate = (fn,dep)=>{
const [const,setCount] = useState(0);
useEffect(()=>{
setCouent((x)=>{x+1})
},[dep])
useEffect(()=>{
if(const >1){
fn()
}
},[count,fn])
}
function App(){
const [n,setN] = useState(0)
useUpdate(()=>{
console.log("n 发生了变化")
},n)
add = ()=>{
setN(x+1)
}
return(
<div>
{n}
<button onClick={this.add}>add</button>
</div>
)
}