封装dialog_React+Element封装Dialog组件

本文介绍如何使用React和Element库封装一个可添加数据的Dialog组件。在创建过程中,由于react-hot-loader和Element版本冲突,需降级react-hot-loader到4.11.1版本。Dialog组件包含visi、can、add三个参数,用于控制显示、取消和添加操作。在回调函数中处理数据清除,实现组件的复用性和易维护性。
摘要由CSDN通过智能技术生成

20c4b320da21976313d393b84a99bb14.png

之前写过一个react项目,一共就几个页面,但是几乎每个页面都有Modal组件(之前是用AntD),而且大多数的功能都很相似,所以想了一下应该开始封装这种类型的组件了。

然后今天花了一点时间做了一个小demo。

注意

这里用到的是React+Element,需要注意的是用create-react-app创建的项目react-hot-loader版本与Element版本好像有冲突,具体原因我还没搞清楚,解决的办法是重装一个react-hot-loader,我这里的版本上是4.11.1。

npm i react-hot-loader@4.11.1

ok,进入正题。

现在要做的是能往一个组件里不断添加数据的Dialog的封装。

首先我们创建一个展示数据的组件。

import React, { useState } from 'react'
import { Button } from 'element-react'

function DemoList () {
    const [data, setData] = useState([])

    return (
        <div>
            {
                data.map(item => (
                    <li key={item.id} style={{ width: '100px', height: '50px', textAlign: 'center' }}>
                        {item.name}
                    </li>
                ))
            }
            <Button>添加新节点</Button>
        </div>
    )
}

export default DemoList;

然后我们再创建一个Dialog的组件,我们大概可以清楚,这个组件需要几个参数。

  • visi:控制这个dialog的显示
  • can:用户点击取消,调用回调函数关闭当前的Dialog
  • add:用户点击确定,调用回调函数并传入用户输入的name
import React, { useState } from 'react'
import { Dialog, Button, Input } from 'element-react'

function AddDialog ({ visi, can, add }) {
    const [name, setName] = useState('')
    return (
        <div>
            <Dialog
                visible={visi}
                onCancel={() => {
                    can()
                }}
            >
                <Dialog.Body>
                    <Input value={name} onChange={e => {setName(e)}} placeholder="请输入名字" />
                </Dialog.Body>
                <Dialog.Footer>
                    <Button onClick={() => {
                        add(name)
                    }}>确定</Button>
                    <Button onClick={() => {
                        can()
                    }}>取消</Button>
                </Dialog.Footer>
            </Dialog>
        </div>
    )
}

export default AddDialog;

ok,准备好这个组件之后我们就要返回DemoList组件写回调函数了。

import React, { useState } from 'react'
import { Button } from 'element-react'
// 这里记得引入组件
import AddDialog from './AddDialog'

function DemoList () {
    const [data, setData] = useState([])
    // 设置一个变量控制Dialog的显示
    const [visible, setVisible] = useState(false)
    // 加入用户输入的数据
    const addData = (name) => {
        const query = {
            id: data.length,
            name: name
        }
        setData([...data, query])
    }
    const cancel = () => {
        setVisible(false)
    }

    return (
        <div>
            {
                data.map(item => (
                    <li key={item.id} style={{ width: '100px', height: '50px', textAlign: 'center' }}>
                        {item.name}
                    </li>
                ))
            }
            // 当点击时显示Dialog
            <Button onClick={() => {setVisible(true)}}>添加新节点</Button>
            // 在这里调用组件
            <AddDialog
                visi={visible}
                add={name => {
                    addData(name)
                    cancel()
                }}
                cal={() => {cancel()}}
            />
        </div>
    )
}

export default DemoList;

这样,就可以进行添加数据了,但是有一个小问题,就是每次添加或取消之后,用户之前输入的那个数据还在,所以我们应该清除掉。

import React, { useState } from 'react'
import { Dialog, Button, Input } from 'element-react'

function AddDialog ({ visi, can, add }) {
    const [name, setName] = useState('')
    // 在这里添加个清除的方法
    cosnt clear = () => {
        setName('')
    }
    return (
        <div>
            <Dialog
                visible={visi}
                onCancel={() => {
                    can()
                    clear()
                }}
            >
                <Dialog.Body>
                    <Input value={name} onChange={e => {setName(e)}} placeholder="请输入名字" />
                </Dialog.Body>
                <Dialog.Footer>
                    <Button onClick={() => {
                        add(name)
                        clear()
                    }}>确定</Button>
                    <Button onClick={() => {
                        can()
                        clear()
                    }}>取消</Button>
                </Dialog.Footer>
            </Dialog>
        </div>
    )
}

export default AddDialog;

这样,这个Dialog组件就封装好了,并且还能在其他组件调用,再也不用ctrl + c, ctrl + v了,而且维护起来也更方便了,当然其他的Dialog都可以这么封装,都是一样的原理。

最后,想说一下,不要像我一样这么烂的变量名(手动掩面,我太着急了点,见谅,我只是个菜鸡)

总结完毕,撒花,睡觉~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值