react动态生成input、select标签以及思路总结

简介: 本文介绍了在React中动态生成input和select标签的方法,包括准备数据结构、在组件挂载时动态添加状态、页面渲染以及输入处理,最后总结了实现思路。

见贤思齐焉,见不贤内自省

首先我们需要有一个数据结构,首先需要是一个数组,当然字段都可以自己定义,我这里没按照规范起名。
核心在于将数据整理好,字段梳理清楚,将state中用到的字段动态插入,提醒必填项也要动态遍历。
比如:

   let stateOptions = [{
   
                value: 'name',
                title: '允许传送',
                type: 'inp',
                isrequird: true
            }, {
   
                value: 'age',
                title: '允许请求',
                type: 'sel',
                isrequird: false
            }, {
   
                value: 'runing',
                title: '允许递归',
                type: 'inp',
                isrequird: true
            }]

value标识当前字段的key
title标识当前input或者select前面的名称
type标识是input还是select
isrequird标识当前是否是必填

这里只写这几项,这是我在写项目之前的一个小样。所以并没有考虑的很全面。

我们需要在页面挂载的时候,将变量动态的添加到状态机中:

 componentDidMount() {
   
        setTimeout(() => {
   
            let stateOptions = [{
   
                value: 'name',
                title: '允许传送',
                type: 'inp',
                isrequird: true
            }, {
   
                value: 'age',
                title: '允许请求',
                type: 'sel',
                isrequird: false
            }, {
   
                value: 'runing',
                title: '允许递归',
                type: 'inp',
                isrequird: true
            }]
            //创建一个临时对象 添加属性方便
            let newObkj = {
   }
            //初始化在view层需要用到的变量 放置state中
            stateOptions.map(i => {
   
                // 到时候换成字段标识
                if (i.value === 'age') {
   
                    newObkj[i.value] = []
                } else {
   
                    newObkj[i.value] = ''
                }
            })
            //使用解构赋值的形式直接将生成好的变量对象放置state中
            this.setState({
   
                // 解构到state中
                ...newObkj,
                myOptionList: stateOptions
            })
        })

    }

页面使用:

    render() {
   
        let {
    myOptionList, } = this.state
        // 随机生成options 数组
        const children = [];
        for (let i = 10; i < 36; i++) {
   
            children.push({
    title: `${
     i.toString(36) + i}`, key: `${
     i.toString(36) + i}` });
        }
        // 必填标识  * 
        let isrequird = <a href="#!" style={
   {
    color: '#ff7875', fontSize: '12px', marginTop: '8px', marginLeft: '8px' }}>*</a>
        return (
            <div className="context" >
                <div className="search"  >
                    <div className="search-input">
                        <p className="search-input-title">{
   'XX设置'}</p>
                        <div className="search-input-row" style={
   {
    marginTop: '20px' }} style={
   {
    flexDirection: "column" }}>
                            <span style={
   {
    marginRight: '6%' }}></span>
                            <div style={
   {
    textAlign: 'right', whiteSpace: 'nowrap', display: 'flex', flexDirection: "column", justifyContent: 'space-between' }}>
                                {
   
                                    myOptionList.map((item, index) => {
   
                                        return (
                                            item.type === 'inp' ?
                                                <div key={
   index} style={
   {
    display: 'flex', marginBottom: '10px' }}>
                                                    <Input value={
   this.state[`${
     item.value}`]} title={
   `${
     item.title}`} onChange={
   (e) => this.inputName(`${
     item.value}`, e.target.value)} />
                                                    {
   item.isrequird ? isrequird : ''}
                                                </div>
                                                :
                                                item.type === 'sel' ?
                                                    <div key={
   index} className="search-input-row-element" style={
   {
    marginBottom: '10px', display: 'flex', marginLeft: '0px' }}>
                                                        <Select
                                                            title={
   `${
     item.title}:`}
                                                            showArrow={
   true}
                                                            mode="tags"
                                                            style={
   {
   }}
                                                            value={
   this.state[`${
     item.value}`]}
                                                            onChange={
   (e) => {
    this.inputName(`${
     item.value}`, e) }}
                                                            tokenSeparators={
   [',']}
                                                            options={
   children}
                                                            keyField="key"
                                                            valueField="key"
                                                            titleField="title"
                                                            dropdownMatchSelectWidth={
   true}
                                                        ></Select>
                                                        {
   item.isrequird ? isrequird : ''}
                                                    </div>
                                                    : ''
                                        )
                                    })
                                }
                            </div>
                        </div >
                    </div>
                </div>
                <div className="device_search" style={
   {
    marginLeft: "0px", marginBottom: '20px', marginTop: '20px', textAlign: "center" }}>
                    <Button Type="noIcon" title="测试按钮" onClick={
   () => this.bottomBtnClick('1')}></Button>
                    <span style={
   {
    marginRight: '20px' }}></span>
                    <Button Type="noIcon" color="#E6A23C" title="返回" onClick={
   () => this.bottomBtnClick('2')}></Button>
                </div>
            </div>
        )
    }

上方使用三木运算判断标识显示input组件还是select组件,是否显示必填的标识。
动态生成了select中的options。
input和select输入获取值放置统一方法中:

    // 输入框 输入
    inputName = (type, e) => {
   
        let tempData = {
   }
        if (e.target) {
   
            tempData[type] = e.target.value
        } else {
   
            tempData[type] = e
        }
        this.setState(tempData)
    }

点击提交的时候动态遍历所有的必输项,没输入则提示:

    bottomBtnClick = () => {
   
        let {
    myOptionList } = this.state
        // 动态遍历 必输项
        // 提交前判断格式中是否有必填项
        for (let key in myOptionList) {
   
            if (myOptionList[key].isrequird) {
   
                if (this.state[`${
     myOptionList[key].value}`] === '' || this.state[`${
     myOptionList[key].value}`].toString() === '[]') {
   
                    message.error(`请将${
     myOptionList[key].title}填写完整!`);
                    return false
                }

            }
        }
        console.log(this.state)
    }

全部代码:里面所有的都是使用antd组件写的,所有只看思路就ok

import React from 'react'
import {
    message } from 'antd';
import {
    withRouter } from 'react-router-dom'
import Button from '../../component/Button';
import Select from '../../component/Select';
import Input from '../../component/Input';

class Options extends React.Component {
   
    state = {
   
        myOptionList: [],
    }
    componentDidMount() {
   
        setTimeout(() => {
   
            let stateOptions = [{
   
                value: 'name',
                title: '允许传送',
                type: 'inp',
                isrequird: true
            }, {
   
                value: 'age',
                title: '允许请求',
                type: 'sel',
                isrequird: false
            }, {
   
                value: 'runing',
                title: '允许递归',
                type: 'inp',
                isrequird: true
            }]
            let newObkj = {
   }
            stateOptions.map(i => {
   
                // 到时候换成字段标识
                if (i.value === 'age') {
   
                    newObkj[i.value] = []
                } else {
   
                    newObkj[i.value] = ''
                }
            })
            this.setState({
   
                // 解构到state中
                ...newObkj,
                myOptionList: stateOptions
            })
        })

    }
    // 输入框 输入
    inputName = (type, e) => {
   
        let tempData = {
   }
        if (e.target) {
   
            tempData[type] = e.target.value
        } else {
   
            tempData[type] = e
        }
        this.setState(tempData)
    }

    bottomBtnClick = () => {
   
        let {
    myOptionList } = this.state
        // 动态遍历 必输项
        // 提交前判断格式中是否有必填项
        for (let key in myOptionList) {
   
            if (myOptionList[key].isrequird) {
   
                if (this.state[`${
     myOptionList[key].value}`] === '' || this.state[`${
     myOptionList[key].value}`].toString() === '[]') {
   
                    message.error(`请将${
     myOptionList[key].title}填写完整!`);
                    return false
                }

            }
        }
        console.log(this.state)
    }
    render() {
   
        let {
    myOptionList, } = this.state
        // 随机生成options 数组
        const children = [];
        for (let i = 10; i < 36; i++) {
   
            children.push({
    title: `${
     i.toString(36) + i}`, key: `${
     i.toString(36) + i}` });
        }
        // 必填标识  * 
        let isrequird = <a href="#!" style={
   {
    color: '#ff7875', fontSize: '12px', marginTop: '8px', marginLeft: '8px' }}>*</a>
        return (
            <div className="context" >
                <div className="search"  >
                    <div className="search-input">
                        <p className="search-input-title">{
   'XX设置'}</p>
                        <div className="search-input-row" style={
   {
    marginTop: '20px' }} style={
   {
    flexDirection: "column" }}>
                            <span style={
   {
    marginRight: '6%' }}></span>
                            <div style={
   {
    textAlign: 'right', whiteSpace: 'nowrap', display: 'flex', flexDirection: "column", justifyContent: 'space-between' }}>
                                {
   
                                    myOptionList.map((item, index) => {
   
                                        return (
                                            item.type === 'inp' ?
                                                <div key={
   index} style={
   {
    display: 'flex', marginBottom: '10px' }}>
                                                    <Input value={
   this.state[`${
     item.value}`]} title={
   `${
     item.title}`} onChange={
   (e) => this.inputName(`${
     item.value}`, e.target.value)} />
                                                    {
   item.isrequird ? isrequird : ''}
                                                </div>
                                                :
                                                item.type === 'sel' ?
                                                    <div key={
   index} className="search-input-row-element" style={
   {
    marginBottom: '10px', display: 'flex', marginLeft: '0px' }}>
                                                        <Select
                                                            title={
   `${
     item.title}:`}
                                                            showArrow={
   true}
                                                            mode="tags"
                                                            style={
   {
   }}
                                                            value={
   this.state[`${
     item.value}`]}
                                                            onChange={
   (e) => {
    this.inputName(`${
     item.value}`, e) }}
                                                            tokenSeparators={
   [',']}
                                                            options={
   children}
                                                            keyField="key"
                                                            valueField="key"
                                                            titleField="title"
                                                            dropdownMatchSelectWidth={
   true}
                                                        ></Select>
                                                        {
   item.isrequird ? isrequird : ''}
                                                    </div>
                                                    : ''
                                        )
                                    })
                                }
                            </div>
                        </div >
                    </div>
                </div>
                <div className="device_search" style={
   {
    marginLeft: "0px", marginBottom: '20px', marginTop: '20px', textAlign: "center" }}>
                    <Button Type="noIcon" title="测试按钮" onClick={
   () => this.bottomBtnClick('1')}></Button>
                    <span style={
   {
    marginRight: '20px' }}></span>
                    <Button Type="noIcon" color="#E6A23C" title="返回" onClick={
   () => this.bottomBtnClick('2')}></Button>
                </div>
            </div>
        )
    }
}
export default withRouter(Options)

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

目录
相关文章
|
5月前
|
前端开发 JavaScript 网络架构
react对antd中Select组件二次封装
本文介绍了如何在React中对Ant Design(antd)的Select组件进行二次封装,包括创建MSelect组件、定义默认属性、渲染Select组件,并展示了如何使用Less进行样式定义和如何在项目中使用封装后的Select组件。
174 2
react对antd中Select组件二次封装
|
2月前
|
前端开发 JavaScript
React 标签组件 Tag
在现代Web开发中,标签(Tag)是常见的UI元素,用于分类、标记或表示状态。本文基于React框架,介绍如何创建和管理标签组件,涵盖基础使用、样式处理及常见问题与易错点。通过函数式组件定义标签,并使用CSS或CSS-in-JS进行样式处理。常见问题包括样式冲突、事件绑定错误和可关闭标签逻辑错误,提供解决方案如命名空间、CSS模块化和正确事件绑定方法。掌握这些内容有助于提高开发效率和代码质量。
82 27
|
2月前
|
存储 前端开发 JavaScript
React 表单输入组件 Input:常见问题、易错点及解决方案
本文介绍了在 React 中使用表单输入组件 `Input` 的基础概念,包括受控组件与非受控组件的区别及其优势。通过具体代码案例,详细探讨了创建受控组件、处理多个输入字段、输入验证和格式化的方法,并指出了常见易错点及避免方法,旨在提升表单的健壮性和用户体验。
60 4
|
4月前
|
前端开发 JavaScript UED
react-router 里的 Link 标签和 a 标签有什么区别
`react-router` 中的 `Link` 标签与 HTML 中的 `a` 标签的主要区别在于:`Link` 是专门为 React 应用设计的,用于实现客户端路由导航,不会触发页面的重新加载,而 `a` 标签则会刷新整个页面。使用 `Link` 可以提升应用的性能和用户体验。
|
5月前
|
前端开发 算法 JavaScript
React项目input输入框输入自动失去焦点
本文讨论了在React项目中如何处理input输入框自动失去焦点的问题,特别是在移动端开发中。文章提供了一个使用React Native的TouchableWithoutFeedback组件来监听点击事件,并在事件处理函数中通过调用Keyboard.dismiss()方法使输入框失去焦点的示例代码。这种方法可以确保在用户点击页面其他区域时,键盘能够收起,输入框失去焦点。
183 1
React项目input输入框输入自动失去焦点
|
5月前
|
前端开发 JavaScript
React中Fragment标签和空标签的使用
在React中,Fragment标签用于包裹多个子元素,避免添加不必要的DOM元素,空标签`<>`是Fragment的简写形式。
45 2
|
5月前
|
JavaScript 前端开发
react字符串转为dom标签,类似于Vue中的v-html
本文介绍了在React中将字符串转换为DOM标签的方法,类似于Vue中的`v-html`指令,通过使用`dangerouslySetInnerHTML`属性实现。
151 0
react字符串转为dom标签,类似于Vue中的v-html
|
3月前
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
118 9
|
4月前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
3月前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
270 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生