react實(shí)現(xiàn)動(dòng)態(tài)選擇框
本文實(shí)例為大家分享了react實(shí)現(xiàn)動(dòng)態(tài)選擇框的具體代碼,供大家參考,具體內(nèi)容如下
小需求
在工作中,我們也會碰到這種需求: 為了提高用戶的體驗(yàn),在搜索的時(shí)候,采用靈活查詢。用戶可以自己選擇查詢項(xiàng)并且填寫對應(yīng)的值。

這篇博文涉及知識點(diǎn)在這篇博文“react+antd 動(dòng)態(tài)編輯表格數(shù)據(jù)”中提及過。大家可以先去這篇學(xué)習(xí)一下然后這里。
示例代碼
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() {
? ? // 可選項(xiàng)
? ? const [choseList, setChoseList] = useState(['商品ID', '款號', '產(chǎn)品線','一級類目','二級類目','三級類目','渠道'])
? ? // 已存在選
? ? const [exitChoseList, setExitChostList] = useState([])
? ? /**
? ? ?* ?searchData的數(shù)據(jù)結(jié)構(gòu)是:
? ? ?* ? ? ?{
? ? ?* ? ? ? ? ?// 選擇項(xiàng)
? ? ? ? ? ? ? ? 'sort': '',
? ? ? ? ? ? ? ? // 用戶選擇的值,即在多選框中選擇的值
? ? ? ? ? ? ? ? 'value': [],
? ? ? ? ? ? ? ? // 可選擇項(xiàng)
? ? ? ? ? ? ? ? 'chose_list': [],
? ? ? ? ? ? ? ? // 用戶選擇一個(gè)選擇項(xiàng)之后,這個(gè)選擇項(xiàng)對應(yīng)的所有的選擇。例如: 選擇項(xiàng)為“季節(jié)”則春夏秋冬
? ? ? ? ? ? ? ? '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) => {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 判斷用戶選擇的選擇項(xiàng)是否已經(jīng)存在
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(exitChoseList.indexOf(value) == -1){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 用戶選擇的選擇項(xiàng)不存在的時(shí)候,判斷是否已經(jīng)有選擇項(xiàng)了
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(searchData[index]['sort']!= ''){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 要是存在選擇項(xiàng)的話
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let obj = [...exitChoseList]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 先把之前的選擇項(xiàng)刪除掉
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? obj.splice(index, 1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 添加新的選擇項(xiàng)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 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{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 不存在選擇項(xiàng)的話
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let obj = [...exitChoseList]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setExitChostList([])
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 添加選擇項(xiàng)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 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('已存在這個(gè)選擇項(xiàng)了')
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? }}>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 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總結(jié)
這里就是采用了react中的: […searchData] 這個(gè)特性,造的第一個(gè)組件。后續(xù)還會繼續(xù)分享自己的造的組件。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
react?umi?刷新或關(guān)閉瀏覽器時(shí)清除localStorage方式
這篇文章主要介紹了react?umi?刷新或關(guān)閉瀏覽器時(shí)清除localStorage方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
詳解react-native WebView 返回處理(非回調(diào)方法可解決)
這篇文章主要介紹了詳解react-native WebView 返回處理(非回調(diào)方法可解決),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02
在?React?Native?中使用?CSS?Modules的配置方法
有些前端工程師希望也能像開發(fā) web 應(yīng)用那樣,使用 CSS Modules 來開發(fā) React Native,本文將介紹如何在 React Native 中使用 CSS Modules,需要的朋友可以參考下2022-08-08
React Native使用fetch實(shí)現(xiàn)圖片上傳的示例代碼
本篇文章主要介紹了React Native使用fetch實(shí)現(xiàn)圖片上傳的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
react源碼中的生命周期和事件系統(tǒng)實(shí)例解析
這篇文章主要為大家介紹了react源碼中的生命周期和事件系統(tǒng)實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
React項(xiàng)目中應(yīng)用TypeScript的實(shí)現(xiàn)
TypeScript通常都會依賴于框架,例如和vue、react 這些框架結(jié)合,本文就主要介紹了React項(xiàng)目中應(yīng)用TypeScript的實(shí)現(xiàn),分享給大家,具體如下:2021-09-09
react搭建在線編輯html的站點(diǎn)通過引入grapes實(shí)現(xiàn)在線拖拉拽編輯html
Grapes插件是一種用于Web開發(fā)的開源工具,可以幫助用戶快速創(chuàng)建動(dòng)態(tài)和交互式的網(wǎng)頁元素,它還支持多語言和多瀏覽器,適合開發(fā)響應(yīng)式網(wǎng)頁和移動(dòng)應(yīng)用程序,這篇文章主要介紹了react搭建在線編輯html的站點(diǎn)通過引入grapes實(shí)現(xiàn)在線拖拉拽編輯html,需要的朋友可以參考下2023-08-08

