1. useState——见react语法(2)
2. useEffect——见react语法(2)
3. useRef—获取页面元素
用来获取页面中的元素,这样就可以对这个元素进行操作。获取元素需要使用.current才能获取到页面中的具体元素。
定义:box=useRef(null)
绑定:<div ref={box}></div>
使用:box.current.样式等等
简单使用:
import { useEffect, useRef } from 'react'
export default function App() {
let box = useRef(null);
useEffect(() => {
box.current.style.backgroundColor = 'skyblue';
},[box])
return (
<div>
<h2>App</h2>
<div ref={box}>box</div>
</div>
);
}
使用react框架实现原生放大镜效果和拖拽效果。
4. 组件反向传值
父组件传给子组件的值,子组件只能渲染,不能更改。想要子组件可以更改父组件传的数据,可以使用反向传参。就是父组件将数据和方法都传给子组件,子组件修改完后再传给父组件。
// 父组件
import React, { useState } from "react";
import Box from "./Box.jsx";
export default function App() {
let [msg, setMsg] = useState("父传给子的");
return (
<div>
<h2>App---{msg}</h2>
<Box data={[msg, setMsg]}></Box>
</div>
);
}
// 子组件
export default function Box({ data }) {
let [msg, setMsg] = data;
let changebox = () => {
setMsg("子反向传给父的");
}
return (
<div>
<h3>Box---{msg}</h3>
<button onClick={changebox}>changebox</button>
</div>
);
}
5. useCallback—缓存函数
使用时机:当组件被多次重复调用时,组件内部的局部函数就要用useCallback来包裹。主要是用来优化代码的。
当Box被多次使用时,fm函数创建了多次(因为函数是一种引入数据),但它的函数体内的逻辑代码却是一样的,这样设计的局部函数会导致性能问题
解决办法——useCallback。fm函数是用useCallback生成的,所以就算Box组件重复使用时,传入的回调函数只会生成一次。
案例:当页面第一次渲染时,由于父组件给子组件传的值是有四个元素的数组,所以fm运行了四次,也就是Box组件中打印了四次111。使用useEffect函数来监听fm函数。
// 父组件
import React, { useState } from "react";
import Box from "./Box.jsx";
export default function App() {
let info = [
{ id: 1, text: "商品1"},
{ id: 2, text: "商品2"},
{ id: 3, text: "商品3"},
{ id: 4, text: "商品4" },
];
let fm = (arg) => {
console.log(arg);
};
return (
<div>
<h2>App</h2>
{info.map((el) => (
<Box data={el} key={el.id} like={fm}></Box>
))}
</div>
);
}
// 子组件
import React, { useCallback, useEffect, useState } from "react";
export default function Box({ data, like }) {
let [count, changeCount] = useState(2);
let fm=()=>{like(data.id); }
useEffect(() => {
console.log(111);
}, [fm]);
return (
<div>
<div>{data.text}---{count}</div>
<button onClick={fm}>点赞</button>
<button onClick={() => changeCount(count + 1)}>加1</button>
</div>
);
}
通过“加1”按钮,使count增加时,会发现fm也运行了,也就是count改变一次就运行一次fm,而是实际中,我们只改变了count的值,和fm没有关系,就会影响性能。我们想要的是,把在函数组件内部定义的函数保存起来,当组件重新渲染时还是使用之前的,就不会被重新定义一次。
// 将上面的fm函数换成下面这个就可以实现了
let fm = useCallback(() => {
like(data.id);
}, [count]);