網站首頁 編程語言 正文
本文實例為大家分享了react實現動態選擇框的具體代碼,供大家參考,具體內容如下
小需求
在工作中,我們也會碰到這種需求: 為了提高用戶的體驗,在搜索的時候,采用靈活查詢。用戶可以自己選擇查詢項并且填寫對應的值。
這篇博文涉及知識點在這篇博文“react+antd 動態編輯表格數據”中提及過。大家可以先去這篇學習一下然后這里。
示例代碼
import React, { Component, useState } from 'react';
import { Button, Col, message, Select, Row, Input } from 'antd'
import { PlusCircleOutlined, MinusCircleOutlined } from '@ant-design/icons';
const { Option } = Select
function Index() {
? ? // 可選項
? ? const [choseList, setChoseList] = useState(['商品ID', '款號', '產品線','一級類目','二級類目','三級類目','渠道'])
? ? // 已存在選
? ? const [exitChoseList, setExitChostList] = useState([])
? ? /**
? ? ?* ?searchData的數據結構是:
? ? ?* ? ? ?{
? ? ?* ? ? ? ? ?// 選擇項
? ? ? ? ? ? ? ? 'sort': '',
? ? ? ? ? ? ? ? // 用戶選擇的值,即在多選框中選擇的值
? ? ? ? ? ? ? ? 'value': [],
? ? ? ? ? ? ? ? // 可選擇項
? ? ? ? ? ? ? ? 'chose_list': [],
? ? ? ? ? ? ? ? // 用戶選擇一個選擇項之后,這個選擇項對應的所有的選擇。例如: 選擇項為“季節”則春夏秋冬
? ? ? ? ? ? ? ? 'value_chose_list':[]
? ? ? ? ? ? }
? ? ?*/
? ? const [searchData, setSearchData] = useState([])
? ? return (
? ? ? ? <div>
? ? ? ? ? ? <Row style={{ marginLeft: 50, marginTop: 50, width:'100vw', }}>
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? searchData.map((item, index) => {
? ? ? ? ? ? ? ? ? ? ? ? return <Col span={8} style={{ display: 'flex', marginTop:5 }}>
? ? ? ? ? ? ? ? ? ? ? ? ? ? <Select style={{ width: 150 }} value={searchData[index]['sort']} onChange={(value) => {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 判斷用戶選擇的選擇項是否已經存在
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(exitChoseList.indexOf(value) == -1){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 用戶選擇的選擇項不存在的時候,判斷是否已經有選擇項了
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(searchData[index]['sort']!= ''){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 要是存在選擇項的話
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let obj = [...exitChoseList]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 先把之前的選擇項刪除掉
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? obj.splice(index, 1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 添加新的選擇項
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? obj.push(value)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setExitChostList(obj)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let searchDataObj = [...searchData]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setSearchData([])
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 然后將其他的值都配置初始化
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? searchDataObj[index]['value'] = []
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? searchDataObj[index]['sort'] = value
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? searchDataObj[index]['value_chose_list'] = [1,2,3]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setSearchData(searchDataObj)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 不存在選擇項的話
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let obj = [...exitChoseList]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setExitChostList([])
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 添加選擇項
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? obj.push(value)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setExitChostList(obj)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let searchDataObj = [...searchData]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setSearchData([])
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? searchDataObj[index]['sort'] = value
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? searchDataObj[index]['value_chose_list'] = [1,2,3]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setSearchData(searchDataObj)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? message.warn('已存在這個選擇項了')
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? }}>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? item.chose_list.map(i => {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return <Option value={i}>{i}</Option>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? </Select>
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? searchData[index]['sort'] == '商品ID' || '款號' ? <Input style={{ width: 200 }} value={searchData[index]['value']} onChange={(e) => {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let obj = [...searchData]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? obj[index]['value'] = e.target.value
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setSearchData(obj)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }} />
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : <Select value={searchData[index]['value']} style={{ width: 200 }} mode="multiple" onChange={(value) => {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let obj = [...searchData]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? obj[index]['value'] = value
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setSearchData(obj)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }}>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? item.value_chose_list.map(i => {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return <Option value={i}>{i}</Option>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? </Select>
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? <MinusCircleOutlined style={{marginTop:5, marginLeft:10, marginRight:10}} onClick={()=>{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(searchData[index]['sort'] != ''){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let value = searchData[index]['sort']
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let exitChoseObj = [...exitChoseList]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setExitChostList([])
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exitChoseObj.pop(value)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setExitChostList(exitChoseObj)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let obj = [...searchData]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? obj.splice(index, 1);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setSearchData(obj)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? }} />
? ? ? ? ? ? ? ? ? ? ? ? </Col>
? ? ? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? <PlusCircleOutlined style={{ marginLeft: 20, marginTop:10 }} onClick={() => {
? ? ? ? ? ? ? ? ? ? let obj = [...searchData]
? ? ? ? ? ? ? ? ? ? setSearchData([])
? ? ? ? ? ? ? ? ? ? let arr3 = choseList.filter(items => exitChoseList.indexOf(items) == -1);
? ? ? ? ? ? ? ? ? ? obj.push({
? ? ? ? ? ? ? ? ? ? ? ? 'sort': '',
? ? ? ? ? ? ? ? ? ? ? ? 'value': [],
? ? ? ? ? ? ? ? ? ? ? ? 'chose_list': arr3,
? ? ? ? ? ? ? ? ? ? ? ? 'value_chose_list':[]
? ? ? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? ? ? setSearchData(obj);
? ? ? ? ? ? ? ? }} />
? ? ? ? ? ? </Row>
? ? ? ? ? ? <div style={{marginTop:20, marginLeft:50, display:'flex'}}>
? ? ? ? ? ? ? ? <Button type="primary" onClick={()=>{
? ? ? ? ? ? ? ? ? ? console.log(searchData)
? ? ? ? ? ? ? ? }}>搜索</Button>
? ? ? ? ? ? ? ? <Button type="primary" danger onClick={()=>{
? ? ? ? ? ? ? ? ? ? setSearchData([])
? ? ? ? ? ? ? ? ? ? setExitChostList([])
? ? ? ? ? ? ? ? }}>重置</Button>
? ? ? ? ? ? </div>
? ? ? ? </div>
? ? )
}
export default Index
總結
這里就是采用了react中的: […searchData] 這個特性,造的第一個組件。后續還會繼續分享自己的造的組件。
原文鏈接:https://blog.csdn.net/qq_35905501/article/details/120413398
相關推薦
- 2022-05-06 Python面向對象中的封裝詳情_python
- 2022-04-25 ASP.NET?Core?MVC中Form?Tag?Helpers用法介紹_實用技巧
- 2023-03-26 spring?boot整合redis中間件與熱部署實現代碼_Redis
- 2023-02-26 pandas的apply函數用法詳解_python
- 2022-09-22 git只提交部分修改的文件(提交指定文件)
- 2022-03-01 iview表格中 colums中使用render函數的幾種總結
- 2023-07-13 React中使用TS完成父組件調用子組件
- 2022-08-03 Shell常用服務器日志分析命令總結_linux shell
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支