react封装tag多选标签组件

多选Tag效果图

在这里插入图片描述
在这里插入图片描述

封装组件代码

使用class类组件进行基本tag标签封装

基本tag组件代码

import React, { Component } from 'react';
import _ from 'lodash';
import './index.scss';
import { CheckCircleOutlined } from '@ant-design/icons';

class TagFormItem extends Component {
  constructor(props) {
    console.log(props, 'props---');
    super(props);
    this.state = {
      tagValue: props.value,
    };
  }
  UNSAFE_componentWillReceiveProps(nextProps) {
    if (!_.isEqual(nextProps.value, this.props.value)) {
      this.setState({
        tagValue: nextProps.value,
      });
    }
  }
  changeValue = (v) => {
    console.log(v, 'vvvvvvvvv');
    const { tagValue } = this.state;
    const newTagValue = tagValue?.includes(v)
      ? tagValue.filter((el) => el !== v)
      : [...tagValue, v];
    this.setState(
      {
        tagValue: newTagValue,
      },
      () => {
        this.props.onChange(v, newTagValue);
      },
    );
  };
  render() {
    const { dataSource } = this.props;
    const { tagValue } = this.state;
    return (
      <div className="tagFormItem">
        {dataSource?.map((el) => (
          <div
            className={tagValue?.includes(el.value) ? 'tagForm active' : 'tagForm'}
            onClick={() => this.changeValue(el.value)}
            key={el.value}
          >
            {el.label}
            {tagValue?.includes(el.value) ? <CheckCircleOutlined /> : ''}
          </div>
        ))}
      </div>
    );
  }
}

export default TagFormItem;

css代码

.tagFormItem {
  display: flex;
  flex-direction: row;
  flex-flow: row wrap;
  white-space: wrap;
  .tagForm {
    margin-top: 8px;
    text-align: center;
    margin-left: 15px;
    width: 95px;
    height: 28px;
    line-height: 28px;
    border: 1px solid #f9b37a;
    border-radius: 5px;
    color: #313233;
    cursor: pointer;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .active {
    background-color: #f8f8f8;
    color: #ff6a00;
  }
}

引入封装好的组件

在函数式组件中引入

import React, { useState } from 'react';
import TagFormItem from '../../../components/TagSelected';

const Published = () => {
  const [selectedTreeIdList, setSelectedTreeIdList] = useState([]);
  const data = [
    { label: '秦始皇', value: 11 },
    { label: '汉高祖', value: 12 },
    { label: '汉武帝', value: 13 },
    { label: '唐太宗', value: 14 },
    { label: '唐高宗', value: 15 },
    { label: '武则天', value: 16 },
    { label: '唐玄宗', value: 17 },
  ];

  // 选中标签
  const TagFormChange = (val, newVal) => {
    console.log(val, newVal, '00000');
    setSelectedTreeIdList([...newVal]);
  };
  return (
    <div>
      <TagFormItem
        value={selectedTreeIdList}
        onChange={TagFormChange}
        dataSource={data?.map((ds) => ({ ...ds, label: ds.label, value: ds.value }))}
      />
    </div>
  );
};

export default Published;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React 中,组件之间的通信可以通过 props 和事件来实现。如果需要封装两个相互调用的组件,可以将它们的状态和事件都抽离出来,放在一个共同的父组件中。 下面是一个简单的示例: ```jsx import React from 'react'; class ChildA extends React.Component { render() { return ( <div> <h1>Child A</h1> <button onClick={this.props.handleChildAClick}>Click me to update Child B</button> </div> ); } } class ChildB extends React.Component { render() { return ( <div> <h1>Child B</h1> <p>{this.props.message}</p> </div> ); } } class Parent extends React.Component { constructor(props) { super(props); this.state = { message: 'Initial message' }; this.handleChildAClick = this.handleChildAClick.bind(this); } handleChildAClick() { this.setState({ message: 'Updated message from Parent' }); } render() { return ( <div> <ChildA handleChildAClick={this.handleChildAClick} /> <ChildB message={this.state.message} /> </div> ); } } export default Parent; ``` 在这个示例中,ChildA 组件中有一个按钮,当用户点击后会触发 handleChildAClick 事件,这个事件在 Parent 组件中定义。当事件触发后,Parent 组件的状态会更新,然后传递给 ChildB 组件,ChildB 组件会根据新的状态来进行渲染。 使用这个组件时,只需要渲染 Parent 组件即可: ```jsx import React from 'react'; import Parent from './Parent'; function App() { return ( <Parent /> ); } export default App; ``` 这个示例中,ChildA 和 ChildB 组件是相互独立的,它们并不知道对方的存在。它们只是通过共同的父组件来进行通信。这样的设计可以使组件之间的耦合度更低,更容易维护和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值