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

React hooks子组件暴露方法示例

说明

通常情况下,React 子组件使用父组件的方法或值通过props传递,反过来,父组件如果需要子组件的方法就需要子组件将自己的方法暴露出去。以下是一个实例:

User.tsx

import React, { FC, useEffect, useState, useRef } from 'react';
import { Button, Table } from 'antd';
import UserEdit, { UserEditRef } from './UserEdit';
import { EditFilled } from '@ant-design/icons';interface User {desc?: string;name?: string;
}
const User: FC = () => {const userEditRef = useRef<UserEditRef>(null);const columns: any = [{title: '名称',dataIndex: 'name',key: 'name',},{title: '描述',dataIndex: 'desc',key: 'desc',},{title: '操作',render: (_: string, record: User) => {return (<EditFilledonClick={(e) => {userEditRef.current?.open(record);}}/>);},},];const [datasource, setDatasource] = useState<User[]>([{desc: 'I am Tom',name: 'Tom',},{desc: 'I am Marry',name: 'Marry',},]);const updateData = (data?: User) => {const datas = [data, ...datasource];setDatasource(datas);};return (<div><ButtononClick={() => {userEditRef.current.open();}}>新建</Button><Table columns={columns} dataSource={datasource} /><UserEdit ref={userEditRef} onSave={updateData} /></div>);
};export default User;

UserEdit.tsx

import { useState, useImperativeHandle, forwardRef } from 'react';
import { Form, Input, Drawer, Button } from 'antd';interface User {userId?: number;desc?: string;name?: string;
}interface PropType {onSave: Function;
}export interface UserEditRef {open: (currentUser?: User) => void;
}const UserEdit = forwardRef<UserEditRef, PropType>((props, ref) => {//propsconst { onSave } = props;// stateconst [userEditOpen, setUserEditOpen] = useState(false);const [currentFormData, setCurrentFormData] = useState<User>();// 暴露给父组件的属性,open是打开抽屉的方法useImperativeHandle(ref, () => ({open: (currentUser?: User) => {setUserEditOpen(true);setCurrentFormData(currentUser);},}));const onCancel = () => {setUserEditOpen(false);};const onFinish = (values: any) => {onSave(values);setUserEditOpen(false);};return (<Drawertitle={currentFormData ? '用户 | ' + currentFormData?.name : '用户 | 新建'}width="auto"open={userEditOpen}footer={null}onClose={onCancel}destroyOnClose><Form initialValues={currentFormData} onFinish={onFinish}><Form.Itemlabel="组名"name="name"rules={[{ required: true, message: '请输入用户名!' }]}><Input /></Form.Item><Form.Item label="描述" name="desc"><Input.TextArea /></Form.Item><Form.Item><Button type="primary" htmlType="submit">提交</Button><ButtonhtmlType="button"onClick={onCancel}style={{ marginLeft: 8 }}>取消</Button></Form.Item></Form></Drawer>);
});export default UserEdit;

效果预览

1、stackblitz预览
2、InsCode预览

http://www.lryc.cn/news/291078.html

相关文章:

  • 数据结构:大顶堆、小顶堆
  • 电加热热水器上架亚马逊美国站需要的UL174报告
  • 使用visual studio写一个简单的c语言程序
  • 怎么创建facebook广告
  • pdf怎么转成高清图?pdf在线转换器推荐分享
  • postgresql 查询缓慢原因分析
  • N65总账凭证管理凭证查询(sql)
  • 投资1300万欧元!芬兰正式启动量子旗舰项目
  • 【3分钟开服】幻兽帕鲁服务器一键部署保姆教程
  • PandaWallet :Web3.0世界的入口
  • 微软Azure-openAI 测试调用及说明
  • java 图书管理系统 spring boot项目
  • Ubuntu系统安装 Redis
  • 简单记录一下如何安装python以及pycharm(图文教程)(可供福建专升本理工类同学使用)
  • 浏览器内存泄漏排查指南
  • ClickHouse(22)ClickHouse集成HDFS表引擎详细解析
  • idea报错 :(java: 找不到符号)
  • 设计软件最重要的目标是可理解性?
  • 酒店|酒店管理小程序|基于微信小程序的酒店管理系统设计与实现(源码+数据库+文档)
  • C++ 数论相关题目,博弈论,SG函数,集合-Nim游戏
  • ​学者观察 | 区块链技术理论研究与实践观察——中央财经大学朱建明
  • 使用Promethues+Grafana监控Elasticsearch
  • 研学活动报名平台源码开发方案
  • 一篇文章,彻底理解数据库操作语言:DDL、DML、DCL、TCL
  • Linux编辑器之vim的使用
  • 制作OpenSSH 9.6 for openEuler 22.03 LTS的rpm升级包
  • DNS配置文件讲解
  • 142:vue+leaflet 加载tomtom地图(多种形式)
  • Android Mac电脑更改aar中的文件再打包
  • Jmeter脚本录制:抓取IOS手机请求包!