react hooks组件间的传值方式(使用ts),子孙传值给祖先组件

2023-10-29

父子组件传值

参考react hooks组件传值

  • 父传子很简单,只要父组件传参,子组件写好interface childProps和props去接收即可

  • 子传父稍复杂

父组件写一个回调函数:

changeTaskState={(id: any) => { changeTaskStateByID(id) }}

当然这个 changeTaskStateByID我们需要先定义好,id是在子组件返回的一个东西:

const changeTaskStateByID = (id: any) => {
        let changedState = id[1]
        let changedTableList: any = []
        // 数组深拷贝
        changedTableList = JSON.parse(JSON.stringify(tableList))

        let states = ['', '待处理', '已打码', '完成', '异常', '废弃']
        console.log('zichuanfu', id);
        let id_list = id[0]
        let length = id[0]?.length
        console.log('length', length);


        for (let i = 0; i < length; i++) {
            changedTableList.forEach((element: any) => {
                if (element.task_id == id_list[i]) {
                    console.log('有这个id', id_list[i], '修改为', states[changedState]);
                    element.task_status = states[changedState]
                    // console.log(element.task_status);


                }
                // console.log(changedTableList);
                setTableList(changedTableList)
            });
        }

    }

子组件先注册好,props接收:

interface childProps { 
    changeTaskState: Function,
}

const { project_name, project_id, changeTaskState, BatchDeleteTask,changeCoder } = props

我这边在axios返回成功后,使用这个回调函数:return changeTaskState([TaskID, value])

当然我是返回了数组,因为前面父组件我给了id一个any,会比较方便

const handleChangeStateOk = () => {
        setIsModalOpen(false);
        axios.post('/api/task/task', {
            action: "theBatchTaskStatusByIDList",
            newdata: { task_id: TaskID, task_status: value }

        }).then(
            response => {
                console.log('filter', response);

                message.success('批量修改状态成功!');
                return changeTaskState([TaskID, value])
            },
            error => {
                message.error('批量修改状态失败,请刷新重试!');
                // return []
            })

        // dispatch({ type: "changeInquireState", val: !inquireState })
    };

祖孙组件传值

  • 祖先组件传值给孙子组件也很简单,也参考上面这篇文章

  • 孙子组件要传值给祖先组件

完成的需求:根组件有tablelist,孙子组件要去修改tablelist并且根组件同步更新

祖先组件,也就是根组件用Context.Provider包裹,export const Context = createContext({})

这边我给Context一个空对象,(给空数组不行),然后把要传的值和修改值的函数写成一个数组,都作为values传给子孙组件。其实理解为把const [tableList, setTableList] = useState<any>() 都给子组件,让子组件也可以去修改tablelist

const [tableList, setTableList] = useState<any>()   
return (
         <Context.Provider value={[tableList, setTableList]} >
        <Layout>
            {/* <Button onClick={getFilteredTableData}>按钮</Button> */}
            <Layout>
                <Filter ></Filter >
            </Layout>
            <Layout>
                    <CenterFilter />             
            </Layout>
            <Layout className="search-result-list" style={{ marginTop: 0 }}>            
                    <ProjectTable tableList={tableList} />           
            </Layout>
        </Layout>
</Context.Provider>

    )
}

export const Context = createContext({})

子组件:

import { Context } from "../index";
let list = useContext(Context)

// 原来的tablelist
const oriTableList = list[0]
// setTableList
const changeList = list[1]
//数组深拷贝
let changedTableList = JSON.parse(JSON.stringify(oriTableList))
//更加id去修改对应的对象值
changedTableList.forEach((element: any) => {
if (element.project_id == data.project_id) {
    element['project_id'] = response.data.project_id
    element['project_period'] = values.project_year + '-' + values.project_quarter
    element['project_year'] = values.project_year
    element['project_quarter'] = values.project_quarter
    element['project_name'] = values.project_name
    console.log(values.biz_id);
    
    allLineTree.forEach((lineelement: any) => {
        lineelement.children.forEach((childelement: any) => {
            if (childelement.key == values.biz_id) {
                element['biz_name'] = childelement.title
                console.log(childelement.title);
                
            }
        });
    });
   console.log(element); 
}


});
//修改
changeList(changedTableList)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react hooks组件间的传值方式(使用ts),子孙传值给祖先组件 的相关文章

  • jQuery:查找具有特定自定义属性的元素

    我只想找到具有特定自定义属性值的元素 例如 我想找一个div其具有属性data divNumber 6 var number 6 var myDiv data divNumber number 我尝试使用http api jquery co
  • Javascript 进程是否有多个执行线程?

    背景 我正在创建一个 地址簿 类型的应用程序 有很多条目需要加载 一个想法是首先加载一小部分条目 让用户开始 然后将剩余条目排队 优先考虑用户单击的条目 例如 如果他们单击以 X 开头的名称 请先加载这些名称 然后再处理队列的其余部分 这个
  • 有没有一种方法可以在没有输入的情况下发送表单值

    假设我有以下表格
  • Javascript 将对象推送为克隆

    我将 d3 用于交互式网络应用程序 我需要绑定的数据在交互过程中发生变化 并且由 JSON 变量中的一些选定对象组成 为此 我在 JSON 变量上使用了映射 并进行了一些查询来选择适当的对象 对象被推送到列表中 并且该列表被绑定为新数据 我
  • 判断字符串是否包含有效的javascript代码

    我正在寻找一个C 返回的函数true如果字符串包含有效的 JavaScript 语法 例如 IsValidJavascript alert hello 会回来true but IsValidJavascript alertXXhelloZ
  • 从 Angular 6 中的 html 导出 Pdf

    我想从 Angular 6 中的 html 导出 pdf 所以 我正在使用jspdf图书馆 但我不能给出颜色和背景颜色等样式 我怎样才能实现这个目标 如果有其他免费图书馆jspdf 我可以用它 您可以从下面的链接查看演示 DEMO http
  • 更新存储在 chrome 扩展本地存储中的对象

    我正在开发一个 chrome 扩展 我将存储服务器发送的对象 例如 我将收到 命令 id 1 类型 A 大小 B 优先级 C 如果我有一个数据库 我会将其作为表中的一行插入commands 使用 chrome storage 我将这些对象的
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • EmberJS:对象作为查询参数来刷新模型

    我遵循了查询参数指南 http guides emberjs com v1 11 0 routing query params http guides emberjs com v1 11 0 routing query params 而且效
  • 为什么无论状态是对象还是字符串,React 重新渲染的方式都不同?

    下面的反应示例 userProfile状态是一个object 第一次渲染 状态是 第二次渲染 状态是res data gt 无限重新渲染 If userProfile更改为string e g useState with setUserPr
  • 使用 float:left 与 display:inline-block 的 jQuery UI 拖放排序比较

    我这里有两个例子 这两个例子之间的唯一区别是 一种使用display inline block 另一种使用float left li doc item 显示 内联块 与 li doc item float left 我的问题是 displa
  • jquery 中的函数返回未定义[重复]

    这个问题在这里已经有答案了 我在 jquery 中调用的函数返回未定义 我检查了该函数 当我对其进行调试时 它返回正确的数据 function addToPlaylist component type add to pl value pl
  • 从 Context Provider 重定向 React Router

    我是 React Router 的新手 并尝试使用新的 Conext API 从提供程序内部进行重定向 基本上我的提供者看起来像这样 AuthContext js class AuthProvider extends React Compo
  • AngularJS + jQuery 移动

    是否还有其他可能性来设计AngularJS以移动友好的方式应用程序CSS 我正在计划一个移动应用程序 并希望使用 AngularJS 进行逻辑和数据绑定 但我不想自己设计所有内容CSS The AngularJSFAQ说它使用jQuery
  • Angular2:动态同步http请求

    Goal 发出一系列同步 http 请求并能够将它们作为一个可观察流进行订阅 示例 不工作 let query arr test1 test2 test3 function make request query arr if query a
  • 如何从 html 页面 [javascript] 调用 Web 服务方法而不刷新页面

    我有一个webservice这将返回一个值 我的要求是 我需要调用它webservice从一个index html页面 该页面有一个 html 提交按钮 在该按钮上单击我正在呼叫JavaScript 从那里我想调用网络方法 我怎样才能做到这
  • 如何在React中动态分配属性?

    这是一个有两个参数的函数 我要创建的标签的名称 具有以下属性的对象 Using React 我创建一个组件并将该元素渲染到 DOM 问题是我想向元素添加属性 但它不允许循环在元素内设置属性 var Element function elem
  • node.js 模块/导出系统:是否可以将模块导出为函数

    我想在 Dispatch js 中做这样的事情 function handle msg exports handle 这在调用index js中 var dispatch require Dispatch dispatch data 有任何
  • Google 地图 API - 地图未显示 - 没有错误

    我正在尝试将地图从 Google API 加载到 div 中 但是 地图未加载 并且没有输出任何错误 这是代码 google maps var geocoder map function codeAddress address geocod
  • 如何跨多个文件跨越 javascript 命名空间?

    我永远忽略了javascript 几年前我开始使用 jQuery 这样我就可以过得去 但随着我开始更多地进行 TDD 我昨天决定真正深入研究 javascript 之后可能还有咖啡脚本 在我的 ASP NET Web 窗体应用程序中 我有很

随机推荐

  • 颠倒字节数组

    public static void main String args byte a 10 0 80 68 53 for int i 0 i
  • 数据结构小白之斐波那契查找

    1 斐波那契数列的简单介绍 摘自百度 斐波那契数列 Fibonacci sequence 又称黄金分割数列 因数学家列昂纳多 斐波那契 Leonardoda Fibonacci 以兔子繁殖为例子而引入 故又称为 兔子数列 指的是这样一个数列
  • java 时区错乱,设置了时区的SimpleDateFormat获取正确的值,但时区错误

    我在Spring应用程序中进行了一个简单的测试 该应用程序的默认时区设置为UTC SpringBootApplication public class MemberIntegrationApp Autowired private TimeZ
  • redis HyperLogLog,看这篇就够了

    文章目录 前言 一 动手试试 1 添加 2 统计 3 合并 二 原理 1 伯努利过程 2 HyperLogLog 2 1 工作原理 2 2 占用内存大小 2 3 内存优化 3 数据编码 3 1 稀疏编码 3 2 密集编码 3 3 转码 前言
  • WebAssebmly初级——调试C++代码(三)

    系列文章目录 WebAssebmly初级 文章目录 系列文章目录 前言 一 安装扩展程序 二 使用 1 生成 2 开启调试 前言 对于一个研发来说 写代码可以在许多编译器上编写 编译器体验感对于写代码来说可以是相当重要 可是更影响程序员体验
  • 经典兔子问题java解决

    经典兔子问题 题目 古典问题 有一对兔子 从出生后第 3 个月起每个月都生一对兔子 小兔子长到第三个月后每个月又生一对兔子 假如兔子都不死 问每个月的兔子总数为多少 解题思路 我们可以观察到第一个月1对兔子 第二个月1对兔子 第三个月2对兔
  • 基于遗传算法求解旅行商问题

    基于遗传算法求解旅行商问题 旅行商问题 Traveling Salesman Problem 简称TSP 是一个经典的组合优化问题 其目标是找到一条最短路径 使得一个旅行商可以经过所有给定的城市并回到起始城市 同时每个城市只能经过一次 由于
  • element ui dropdown下拉 复选框+全选+搜索功能 组件 (开箱即食)

    element ui dropdown下拉 复选框 全选 搜索功能 组件 开箱即食 可以传入默认值默认选中 可以全选 可以搜索 点击确定把选中的值传给父级 开箱即食
  • ​​Android平台GB28181历史视音频文件下载规范探讨及技术实现

    技术背景 上篇blog 我们提到了 Android平台GB28181历史视音频文件检索规范探讨及技术实现 文件检索后 GB28181平台侧 可以针对文件列表进行回放或下载操作 本文主要探讨视音频文件下载相关 规范解读 视音频文件下载基本要求
  • MMsegmentation教程 5: 训练技巧

    MMSegmentation 支持如下训练技巧 主干网络和解码头组件使用不同的学习率 Learning Rate LR 在语义分割里 一些方法会让解码头组件的学习率大于主干网络的学习率 这样可以获得更好的表现或更快的收敛 在 MMSegme
  • TypeError: decoding str is not supported

    问题描述 这里我是要读取 edf文件 常规的文本阅读器是没法正常查看该文件格式的 比如记事本打开存在乱码 这里是解析的时候出现了问题 查询各种正则化表达式 x14 没有任何问题的 报错一直指向这一句 尝试修改都无疾而终 unicode an
  • opencv-腐蚀erode()

    功能 腐蚀是对白色部分 高亮部分 而言的 腐蚀就是原图中的高亮部分被腐蚀 领域被蚕食 效果图拥有比原图更小的高亮区域 腐蚀就是一个平移的结果匀速包含在 原图中的所有点的集合 原型 void cv erode InputArray src O
  • Mac下安装rocketMQ

    一 前提是电脑上已经安装了JDK 没有安装的参照 https jingyan baidu com article 908080221f3cfefd91c80fbf html 二 RocketMQ的下载与安装 下载 官网地址 http roc
  • 利用windows服务器自带的IIS搭建网站并发布公网访问【内网穿透】

    文章目录 1 前言 2 Windows网页设置 2 1 Windows IIS功能设置 2 2 IIS网页访问测试 3 Cpolar内网穿透 3 1 下载安装Cpolar 3 2 Cpolar云端设置 3 3 Cpolar本地设置 4 公网
  • Ocaml 对偶、元组

    1 对偶 元组 Ocaml语言中 构造乘积类型的操作符是 类型A和类型B的乘积类型记 A B 构造乘积类型的元素的操作符是逗号 如果a属于类型A b属于类型B 那么 a b 属于类型A B 二元乘积类型的元素称为对偶 多元乘积类型中的元素称
  • 浅谈C++函数重载

    C 相较于C语言来说 重载是一重大特性 让我们一起简单的回顾一下重载那些事 传送门 函数重载是什么 为什么有函数重载 函数重载是如何实现的 总结 函数重载是什么 函数重载 是函数的一种特殊情况 C 允许在同一作用域中声明几个功能相似的同名函
  • uniapp中图片宽度100%,高度自适应

    uniapp中图片宽度100 高度自适应
  • EditText限制只能输入汉字字母和空格

    这是第一次使用正则表达式来实现输入框限制输入类型 场景是项目中个人信息模块中的姓名字段只能要求输入这些类型 之前只是用其他的方式实现过其他类型的限制输入 这次想到这个方法边让同事帮忙写了个正则 对于正则我可真是心有余而力不足 希望能够帮到大
  • Ajax简介

    目录 Ajax简介 Ajax特点 基础语法 数据编码格式 form表单中 Ajax中 ajax携带数据 回调函数 序列化 响应状态码 Ajax简介 AJAX 全称Asynchronous JavaScript And XML 即异步JS和X
  • react hooks组件间的传值方式(使用ts),子孙传值给祖先组件

    父子组件传值 参考 react hooks组件传值 父传子很简单 只要父组件传参 子组件写好interface childProps和props去接收即可 子传父稍复杂 父组件写一个回调函数 changeTaskState id any g