当前位置: 首页 > article >正文

React第十三节开发中常见问题之(视图更新、事件处理)

一、视图更新有哪些方案?

1、对于数据变量 正常的增删改查,只会让数据更新,但是不会触发 React 视图的更新;

如:

<script lang="jsx">

const baseTable = [
    {name:'Andy', age: 18, id: 1},
    {name:'Jack', age: 19, id: 2},
]

const handleAdd = () => {
    baseTable.push({
        id: baseTable.length + 1,
        name: `${baseTable.length + 1}-newName`,
        age: baseTable.length + 10
    })
    // 这样操作时,是不会触发React 视图更新的;
}


export default const MyTable = () => {
    return (
        <>
            <button onClick={handleAdd}>新增</button>
        </>
    )
}
export default  MyTable
</script>

2、为什么会出现这种情况?

2.1、局部变量无法在多次渲染中持久保存。当 React 再次渲染这个组件时候,他会从头开始渲染,并不会考虑之前对局部变量的任何更改;
2.2、更改局部变量不会触发渲染。React 没有意识到它 需要使用新数据 重新渲染组件;

3、如何解决?要做到如下两点

3.1、保留 渲染之前的数据
3.2、触发 React 使用新数据渲染组件-达到重新渲染的效果

4、React 内部自带 Hook useState 提供解决方案

4.1、State 变量 用于保存渲染 之间的数据。
4.2、State setter 函数更新变量 并且触发 React 再次渲染组件;

如:

<script lang="jsx">
    import React, { useState } from 'react
    // 比如写一个列表
    const Table = () => {
        // useState() 返回 的第一个参数是初始值,第二是更改初始值的方法;
        const [tableData, setData ] = useState([])
        const handleAdd = () => {
            const curTable = tableData
            curTable.push({id:1, name: 'Andy', age: 18})
            // 通过 setData 修改初始值,并且更新视图
            // 需要浅拷贝的方式获取数据并修改
            // 对于react 来说 引用类型的都是地址,没有重新赋值(地址没有改变),故不会更新视图
            setData([...curTable])
        }
        const Itmes = tableData && tableData.map(itm =>
            return (
                <li key={itm.id} onClick={() => handleEdit(itm)}>{itm.name}</li>
            )
        )
        return (
            <>
                <ul>
                    <Itmes></Itmes>
                </ul>
            </ul>
        )
    }
</script>


二、React 中事件的应用注意事项

1、通常是以 handle 开头的,编程书写习惯,但是为了提高代码的可读性,建议保持良好的编写规范;

<script lang="jsx">
    const myForm = () => {
        const [count, setCount] = useState(0)
        const handleAdd = () => {
            setCount(count + 1)
        }
        return (
            <>
                <div>修改内容:{name}</div>
                {/* 第一种 */}
                <button onClick={() => handleAdd()}>add1</button>
                {/* 第二种 */}
                <button onClick={() => setCount(count + 1)}>add2</button>
                {/* 第三种,此时 handleAdd 后面 没有 () 小括号,不然就是方法直接执行了 */}
                <button onClick={handleAdd}>add3</button>
            </div>
        )
    }
    export default myForm
</script>

2、事件处理函数 props 应该以 on开头,后面跟一个大写字母即驼峰命名

必须传递事件处理函数,而非函数调用! onClick={handleClick}不是 onClick={handleClick()}

子组件

<script lang="jsx">
    // { onSubmit, name } = props 对象
const MyButton  = ({ onSubmit, name }) => {
    return (
        <>
            <button type="button" onClick={() =>onSubmit(name)}>{name}</button>
        </>
    )
}
export default MyButton;
</script>
// 父组件
<script lang="jsx">
    import React, { useState } from 'react'
    import MyButton from './myButton.jsx'
    const MyEvent = () => {
        const [ count, setCount ] = useState(0)
        const handleSubmit = (data) => {
            console.log('submit:', data)
            setCount(`${count}_andy`)
        }
        return (
            <>  
            {/* 
            onSubmit 与子组件 props 中的 onSubmit 保持一致 
            即 等号左侧为 子组件 属性 方法名称;等号右侧为 父组件中的 方法 属性名称
            */}
                <MyButton onSubmit={handleSubmit} name={count}>MyButton</MyButton>
            </>
        )
    }
export default MyEvent
</script>

三、React 事件中处理 阻止冒泡阻止默认事件

利用原生事件的
e.stopPropagation(); --阻止冒泡;
e.preventDefault();–阻止默认事件

<script lang="jsx">
    const myButton = () => {
        const handleSubmit = () => {
            console.log('提交了')
        }
        return (
            <button type="button"
                onClick={(e) => {
                    {/* 阻止事件冒泡 */}
                    e.stopPropagation();
                    handleSubmit()
                }}
            >
                add
            </button>
            <button type="button"
                onClick={(e) => {
                    {/* 阻止默认事件 */}
                    e.preventDefault();
                    handleSubmit()
                }}
            >
                add
            </button>
        )
    }

</script>


http://www.kler.cn/a/428226.html

相关文章:

  • 29. C语言 可变参数详解
  • 三天急速通关JavaWeb基础知识:Day 1 后端基础知识
  • 简要介绍C语言和c++的共有变量,以及c++特有的变量
  • docker安装Redis:docker离线安装Redis、docker在线安装Redis、Redis镜像下载、Redis配置、Redis命令
  • 使用 Redis List 和 Pub/Sub 实现简单的消息队列
  • 关于圆周率的新认知 - 2
  • c++总复习
  • 青牛科技---摄氏温度传感器D35使用手册
  • Linux Ubuntu
  • 聊聊用Rust来写CDD程序
  • mysql8 主从复制一直失败
  • leetcode 999. 可以被一步捕获的棋子数 简单
  • 【数字化】华为企业数字化转型-认知篇
  • centos安装jdk17 并自由切换jdk版本
  • 实用|金融银行项目测试业务流分析+常问面试题
  • 新能源汽车无钥匙进入一键启动功能介绍
  • 关于VS2019scanf的安全问题
  • Uniapp Android SpringBoot3 对接支付宝支付(最新教程附源码)
  • 【Linux】网络服务
  • k8s 之 DaemonSet
  • 【强化学习】策略梯度(Policy Gradient,PG)算法
  • 【MySQL】数据类型的注意点和应用
  • 008.精读《Apache Paimon Docs - Table w/o PK》
  • 【PyQt5教程 二】Qt Designer 信号与槽的使用方法及PyQt5基本小部件说明
  • CentOS8.5.2111(10)基于域名访问的邮件服务配置与管理
  • python录制鼠标键盘操作循环播放