定制表单排序,react, sort

发布于:2025-03-27 ⋅ 阅读:(25) ⋅ 点赞:(0)

概要

在实际开发中,我们常常碰到,一个页面根据条件不同,其展示的表单项需要动态改变位置;但是又不想写重复代码;可以试一下以下方法;

效果

在这里插入图片描述

使用的技术

  • Html
  • React,useMemo
  • ES6的扩展运算

代码

import React, { Fragment, useMemo } from 'react'

export default function DefaultPage() {

    const testComponent = () => {
        return <div key={"nationality"}>国籍:
            <select>
                <option value="1">中国</option>
                <option value="2">美国</option>
                <option value="3">韩国</option>
            </select>
        </div>

    }

    const fields = useMemo(() => {
        return {
            data: [
                {
                    id: 1,
                    name: 'name',
                    label: "姓名",
                    type: 'text'
                },
                {
                    id: 2,
                    name: 'age',
                    label: "年龄",
                    type: 'text'
                },
                {
                    id: 3,
                    name: 'address',
                    label: "地址",
                    type: 'text'
                }
             
            ],
            other: [
                {
                    id: 4,
                    name: 'email',
                    label: "邮箱",
                    otherComponent: <div>邮箱:<input type='email' /></div>

                },
                {
                    id: 6,
                    name: 'phone',
                    label: "电话",
                    otherComponent: <div>电话:<input type='phone' /></div>
                },
            ],
            other2: [
                {
                    id: 7,
                    name: 'nationality',
                    label: "国籍",
                    otherComponent: testComponent()
                },
            ]
        }
    }, [])


    const defaultFields = [...fields.data, ...fields.other, ...fields.other2]
    const appointFields = ["age", "nationality", "name"]
    const defaultSort = defaultFields.sort((a, b) => a.id - b.id)

    const appointSortList =()=>{
        const list = []
        appointFields.forEach((item) => {
            const newlist = defaultFields.filter((item2) => item2.name === item)
            list.push(...newlist)
        })
        return  list
    }
    const appointSort =  appointSortList()

    const totalRender = (list) => {
        return <div>
            {list?.map((item) => {
                if (item.otherComponent) {
                    return item.otherComponent
                } else {
                    return renderForm(item)
                }
            })}
        </div>
    }
    const renderForm = (item) => {
        return <div key={item.id}>
            {item.label}:
            <input type={item.type} name={item.name} key={item.id} />
        </div>
    }

    return (
        <Fragment>
            默认排序:
            {totalRender(defaultSort)}
            <br/>
            指定排序:---------------
           
            {totalRender(appointSort)}
        </Fragment>

    )
}


< Fragment >是代替<></>标签,无实际意义。指示提醒这是一大块代码块; useMemo是react中用于缓存计算结果的方法,可以根据依赖,动态刷新缓存值

⚠️testComponent方法要写在useMemo方法前,不然会报错
在这里插入图片描述