函数组件
const Hello = (props) =>{
return <div>{props.message)}</div>
}
const Hello = props => <div>{props.message}</div>
function Hello(props){
return <div>{props.message}</div>
}
useState
const App = () => {
const [n, setN] = useState(0);
const onClick = () => {
setN(n + 1);
};
return (
<div>
{n}
<button onClick={onClick}>+1</button>
</div>
);
};
useEffect
模拟 componentDidMount
:
useEffect( ()=> {console.log('第一次渲染')}, [] )
模拟 componentDidUpdate
:
useEffect( ()=> {console.log('任意属性变更')} )
useEffect( ()=>{console.log('n 变了')}, [n])
// 示例:
useEffect(() => {
console.log("state 变了");
});
useEffect(() => {
console.log("n 变了");
}, [n]);
模拟 componentWillUnmount
:
useEffect( ()=> {
console.log('第一次渲染')
return ()=>{
console.log('组件要死了')
}
})
// 示例
const App = () => {
let [childVisible, setChildVisible] = useState(true);
const show = () => {
setChildVisible(true);
};
return (
<div>
{childVisible ? (
<button onClick={() => setChildVisible(false)}>hide</button>
) : (
<button onClick={show}>show</button>
)}
{childVisible ? <Child /> : null}
</div>
);
};
const Child = (props) => {
useEffect(() => {
console.log("渲染或变化了");
return () => {
console.log("Child 销毁了");
};
});
return <div>Child</div>;
};
constructor
函数组件执行的时候,就相当于 constructor
shouldComponentUpdate
useMemo
render
函数组件的返回值 就是 render 的返回值。
自定义 Hook 之 useUpdate
const useUpdate = (fn, dep) => {
const [count, setCount] = useState(0);
useEffect(() => {
setCount((x) => x + 1);
}, [dep]);
useEffect(() => {
if (count > 1) {
fn();
}
}, [count, fn]);
};
const App = () => {
const [n, setN] = useState(0);
const onClick = () => {
setN(n + 1);
};
// 使用
useUpdate(() => {
console.log("n变了");
}, n);
return (
<div>
{n}
<button onClick={onClick}>点击+1</button>
</div>
);
};
能用函数组件就用函数组件
因为简单。