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 (
          <EditFilled
            onClick={
   (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>
      <Button
        onClick={
   () => {
   
          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) => {
   
  //props
  const {
    onSave } = props;
  // state
  const [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 (
    <Drawer
      title={
   
        currentFormData ? '用户 | ' + currentFormData?.name : '用户 | 新建'
      }
      width="auto"
      open={
   userEditOpen}
      footer={
   null}
      onClose={
   onCancel}
      destroyOnClose
    >
      <Form initialValues={
   currentFormData} onFinish={
   onFinish}>
        <Form.Item
          label="组名"
          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>
          <Button
            htmlType="button"
            onClick={
   onCancel}
            style={
   {
    marginLeft: 8 }}
          >
            取消
          </Button>
        </Form.Item>
      </Form>
    </Drawer>
  );
});

export default UserEdit;

效果预览

1、stackblitz预览
2、InsCode预览

相关推荐

  1. React hooks组件暴露方法示例

    2024-01-31 06:10:01       36 阅读
  2. 组件调用父组件方法

    2024-01-31 06:10:01       43 阅读
  3. flutter 父组件调用组件方法

    2024-01-31 06:10:01       16 阅读
  4. 组件调用组件方法组合式 API版)

    2024-01-31 06:10:01       11 阅读
  5. vue组件调用父组件方法

    2024-01-31 06:10:01       34 阅读
  6. Vue.js 中父组件调用组件方法

    2024-01-31 06:10:01       35 阅读
  7. react父组件调用组件方法

    2024-01-31 06:10:01       21 阅读
  8. Vue3+Ant Design 父组件调用组件方法

    2024-01-31 06:10:01       14 阅读
  9. vue3父组件调用组件方法

    2024-01-31 06:10:01       14 阅读
  10. vue3组件调父组件方法

    2024-01-31 06:10:01       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-31 06:10:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-31 06:10:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-31 06:10:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-31 06:10:01       20 阅读

热门阅读

  1. django heroku 部署问题汇总

    2024-01-31 06:10:01       26 阅读
  2. SpringBoot 多模块开发 笔记

    2024-01-31 06:10:01       32 阅读
  3. Jmeter学习系列之三:测试计划详细介绍

    2024-01-31 06:10:01       33 阅读
  4. Python爬虫学习之selenium库

    2024-01-31 06:10:01       36 阅读
  5. 爬虫学习笔记-selenium交互

    2024-01-31 06:10:01       32 阅读
  6. python爬虫学习之selenium_chrome handless的使用

    2024-01-31 06:10:01       33 阅读