React 触发时显示某元素的解决方案汇总

React 触发时显示某元素的解决方案汇总

表格 Table 触发时显示

要在 Arco Design 的 Table 组件中实现鼠标触发某行时才显示该行的某个 Button,我们可以使用以下步骤:

  1. 使用 Table 的 columns 属性定义列
  2. 在 columns 中使用 render 函数来自定义单元格内容
  3. 利用 React 的 useState 钩子来管理鼠标悬停状态
  4. 在 Table 的 onRow 属性中设置鼠标事件处理器

以下是具体的实现代码:

import React, { useState } from 'react';
import { Table, Button } from '@arco-design/web-react';
import type { TableColumnProps } from '@arco-design/web-react/es/Table';

interface DataType {
  key: string;
  name: string;
  age: number;
  address: string;
}

const MyTable: React.FC = () => {
  const [hoveredRowKey, setHoveredRowKey] = useState<string | null>(null);

  const columns: TableColumnProps<DataType>[] = [
    {
      title: '姓名',
      dataIndex: 'name',
      key: 'name',
    },
    {
      title: '年龄',
      dataIndex: 'age',
      key: 'age',
    },
    {
      title: '地址',
      dataIndex: 'address',
      key: 'address',
    },
    {
      title: '操作',
      key: 'action',
      render: (_, record) => (
        <Button
          type="primary"
          style={{ display: hoveredRowKey === record.key ? 'inline-block' : 'none' }}
        >
          操作
        </Button>
      ),
    },
  ];

  const data: DataType[] = [
    { key: '1', name: '张三', age: 32, address: '北京市朝阳区' },
    { key: '2', name: '李四', age: 28, address: '上海市浦东新区' },
    { key: '3', name: '王五', age: 45, address: '广州市天河区' },
  ];

  return (
    <Table
      columns={columns}
      data={data}
      onRow={(record) => ({
        onMouseEnter: () => setHoveredRowKey(record.key),
        onMouseLeave: () => setHoveredRowKey(null),
      })}
    />
  );
};

export default MyTable;

这段代码的工作原理如下:

  1. 我们定义了一个 hoveredRowKey 状态来跟踪当前鼠标悬停的行。
  2. 在 columns 定义中,我们为 "操作" 列添加了一个 render 函数。这个函数根据 hoveredRowKey 的值来决定是否显示按钮。
  3. 在 Table 的 onRow 属性中,我们设置了 onMouseEnter 和 onMouseLeave 事件处理器。这些处理器会更新 hoveredRowKey 的值。
  4. 当鼠标进入某一行时,该行的 key 会被设置为 hoveredRowKey,从而显示该行的按钮。
  5. 当鼠标离开行时,hoveredRowKey 被设置为 null,隐藏所有按钮。

这种方法可以确保只有在鼠标悬停在特定行上时,该行的按钮才会显示。你可以根据需要调整按钮的样式或添加其他交互效果。

如果你需要进一如果你需要进一步定制或有其他要求,可以考虑以下几点:

  1. 性能优化:如果表格数据量很大,可以考虑使用 useMemo 来优化 columns 的定义。
  2. 样式调整:你可能想要调整按钮出现和消失的过渡效果,可以使用 CSS 过渡。
  3. 多个操作按钮:如果需要显示多个操作按钮,可以将它们包装在一个容器中。

这里是一个更加完善的示例,包含了上述优化:

import React, { useState, useMemo } from 'react';
import { Table, Button, Space } from '@arco-design/web-react';
import type { TableColumnProps } from '@arco-design/web-react/es/Table';
import './styles.css';

interface DataType {
  key: string;
  name: string;
  age: number;
  address: string;
}

const MyTable: React.FC = () => {
  const [hoveredRowKey, setHoveredRowKey] = useState<string | null>(null);

  const columns: TableColumnProps<DataType>[] = useMemo(() => [
    {
      title: '姓名',
      dataIndex: 'name',
      key: 'name',
    },
    {
      title: '年龄',
      dataIndex: 'age',
      key: 'age',
    },
    {
      title: '地址',
      dataIndex: 'address',
      key: 'address',
    },
    {
      title: '操作',
      key: 'action',
      render: (_, record) => (
        <Space className={`action-buttons ${hoveredRowKey === record.key ? 'visible' : ''}`}>
          <Button type="primary" size="small">编辑</Button>
          <Button type="primary" status="danger" size="small">删除</Button>
        </Space>
      ),
    },
  ], [hoveredRowKey]);

  const data: DataType[] = [
    { key: '1', name: '张三', age: 32, address: '北京市朝阳区' },
    { key: '2', name: '李四', age: 28, address: '上海市浦东新区' },
    { key: '3', name: '王五', age: 45, address: '广州市天河区' },
  ];

  return (
    <Table
      columns={columns}
      data={data}
      onRow={(record) => ({
        onMouseEnter: () => setHoveredRowKey(record.key),
        onMouseLeave: () => setHoveredRowKey(null),
      })}
    />
  );
};

export default MyTable;

对应的 CSS 文件 (styles.css):

.action-buttons {
  opacity: 0;
  transition: opacity 0.3s ease;
}

.action-buttons.visible {
  opacity: 1;
}

这个优化版本有以下改进:

  1. 使用 useMemo 缓存 columns 定义,只有当 hoveredRowKey 变化时才重新计算。
  2. 使用 CSS 类和过渡效果来平滑显示 / 隐藏按钮。
  3. 使用 Space 组件来包装多个操作按钮,提供更好的间距控制。
  4. 使用 size="small" 属性来减小按钮尺寸,使其更适合表格行高。

这种实现方式既保证了性能,又提供了更好的用户体验。你可以根据具体需求进一步调整按钮的样式、动画效果或添加更多的交互功能好的,我们可以进一步优化和扩展这个表格组件。

列表 List 触发时显示

要在 Arco Design 的 List 组件中实现鼠标触发某行时才显示该行的某个 Button,我们可以采用类似于 Table 的方法。以下是实现步骤和代码:

  1. 使用 List 组件来渲染列表
  2. 在 List.Item 中自定义内容
  3. 使用 React 的 useState 钩子来管理鼠标悬停状态
  4. 为每个 List.Item 添加鼠标事件处理器

以下是具体的实现代码:

import React, { useState } from 'react';
import { List, Button } from '@arco-design/web-react';
import './styles.css';

interface ListItemType {
  id: string;
  title: string;
  description: string;
}

const MyList: React.FC = () => {
  const [hoveredItemId, setHoveredItemId] = useState<string | null>(null);

  const data: ListItemType[] = [
    { id: '1', title: '标题1', description: '描述1' },
    { id: '2', title: '标题2', description: '描述2' },
    { id: '3', title: '标题3', description: '描述3' },
  ];

  return (
    <List
      className="custom-list"
      dataSource={data}
      render={(item) => (
        <List.Item
          key={item.id}
          onMouseEnter={() => setHoveredItemId(item.id)}
          onMouseLeave={() => setHoveredItemId(null)}
        >
          <div className="list-item-content">
            <div>
              <h3>{item.title}</h3>
              <p>{item.description}</p>
            </div>
            <Button
              type="primary"
              className={`action-button ${hoveredItemId === item.id ? 'visible' : ''}`}
            >
              操作
            </Button>
          </div>
        </List.Item>
      )}
    />
  );
};

export default MyList;

对应的 CSS 文件 (styles.css):

.custom-list .list-item-content {
  display: flex;
  justify-content: space-between;
  align-items: center;
  width: 100%;
}

.custom-list .action-button {
  opacity: 0;
  transition: opacity 0.3s ease;
}

.custom-list .action-button.visible {
  opacity: 1;
}

这段代码的工作原理如下:

  1. 我们定义了一个 hoveredItemId 状态来跟踪当前鼠标悬停的列表项。
  2. 在 List 组件的 render 属性中,我们为每个 List.Item 自定义了内容。
  3. 每个 List.Item 都有 onMouseEnter 和 onMouseLeave 事件处理器,用于更新 hoveredItemId。
  4. 按钮的显示通过 CSS 类来控制。当 hoveredItemId 匹配当前项的 id 时,按钮会显示出来。
  5. 使用 CSS 过渡效果使按钮的出现和消失更加平滑。

这种实现方式可以确保只有在鼠标悬停在特定列表项上时,该项的按钮才会显示。你可以根据需要调整按钮的样式或添加其他交互效果。