React常见知识点

1. setCount(10)与setCount(preCount => preCount + 10) 的区别:

js 复制代码
import React, { useState } from 'react';
export default function CounterHook() {
    const [count, setCount] = useState(() => 10);
    console.log('CounterHook渲染');
    function handleBtnClick() {
        // 下面这种只会加10
        setCount(count + 10);
        setCount(count + 10);
        setCount(count + 10);
        setCount(count + 10);

        // 下面这种会加到40
        // setCount((prevCount) => prevCount + 10);
        // setCount((prevCount) => prevCount + 10);
        // setCount((prevCount) => prevCount + 10);
        // setCount((prevCount) => prevCount + 10);
    }
    return (
        <div>
            <h2>当前计数: {count}</h2>
            <button onClick={handleBtnClick}>+10</button>
        </div>
    );
}

2. 如何在父组件中引用子组件的某个元素? forwardRef

js 复制代码
// 父组件
import React, { useEffect, useRef } from 'react';
import Product from './product';
export default function App(props) {
    const liRef = useRef();
    useEffect(() => {
        console.log('ref', liRef.current)
    })
    return (
        <>
            <Product ref={liRef} />
        </>
    );
}
js 复制代码
// 子组件 - 函数组件
import React from 'react';
import { forwardRef } from 'react';
export default forwardRef((props, ref) => {
    const getProdInfo = function (e) {
        console.log(e.target.innerText);
    };
    return (
        <ul onClick={getProdInfo}>
            <li ref={ref}>商品1</li>
            <li>商品2</li>
        </ul>
    );
});
js 复制代码
// 子组件 - class组件
import React, { forwardRef } from 'react';
class Product extends React.Component {
    constructor(props) {
        super(props);
    }
    getProdInfo = function (e) {
        console.log(e.target.innerText);
    };
    render() {
        console.log(1, this.props)
        return (
            <ul onClick={this.getProdInfo}>
                <li ref={this.props.innerRef}>商品1</li>
                <li>商品2</li>
            </ul>
        );
    }
}
export default forwardRef((props, ref) => <Product innerRef={ref} {...props} />);

联想:
ref的作用

  1. 通过ref操作dom,分为 1.作用在DOM节点上;2作用在组件上(此时为组件的实例);
  2. 用ref引用一个值;参考官网useRef

3. useImperativeHandle

向父组件暴露一个自定义的 ref 句柄。

默认情况下,组件不会将它们的 DOM 节点暴露给父组件。举例来说,如果你想要 MyInput 的父组件 能访问到 <input> DOM 节点,你必须选择使用 forwardRef

js 复制代码
import { forwardRef } from 'react';

const MyInput = forwardRef(function MyInput(props, ref) {
  return <input {...props} ref={ref} />;
});

在上方的代码中,MyInput 的 ref 会接收到 DOM 节点。然而,你可以选择暴露一个自定义的值。为了修改被暴露的句柄,在你的顶层组件调用 useImperativeHandle。

相关推荐
Highcharts.js3 小时前
Highcharts 云端渲染的真相:交互式图表与服务器端生成的边界
前端·信息可视化·服务器渲染·highcharts·图表渲染
zhuyan1084 小时前
Linux 系统磁盘爆满导致无法启动修复指南
前端·chrome
编程牛马姐4 小时前
独立站SEO流量增长:提高Google排名的优化方法
前端·javascript·网络
NotFound4865 小时前
实战指南如何实现Java Web 拦截机制:Filter 与 Interceptor 深度分享
java·开发语言·前端
Dontla5 小时前
高基数(High Cardinality)问题介绍(Prometheus、高基数字段、低基数字段)
前端·数据库·prometheus
whuhewei7 小时前
为什么客户端不存在跨域问题
前端·安全
妮妮喔妮7 小时前
supabase的webhook报错
开发语言·前端·javascript
qq_12084093718 小时前
Three.js 大场景分块加载实战:从全量渲染到可视集调度
开发语言·javascript·数码相机
yivifu8 小时前
手搓HTML双行夹批效果
前端·html·html双行夹注
奔跑的卡卡9 小时前
Web开发与AI融合-第一篇:Web开发与AI融合的时代序幕
前端·人工智能