首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用语义用户界面和钩子来获取下拉列表的值

如何使用语义用户界面和钩子来获取下拉列表的值
EN

Stack Overflow用户
提问于 2021-06-08 14:06:49
回答 1查看 1.1K关注 0票数 1

我正在开发一个表单,在其中,连续有3个下拉列表,最后一个下拉列表可以接受多个值。此外,还有一个添加或删除行的选项。当用户添加一行时,将出现一个具有三个下拉列表的新行。

我使用了React,,Hooks,Typescript来实现这一点。

现在,当表单提交时,我试图从下拉列表中获取所选项的值。但是,我不知道我错过了什么才能实现这一目标。当我添加一行时,新行将接受顶部行的选定项。

我UI的图像

我的代码是这样的:

代码语言:javascript
运行
复制
import { Formik } from "formik";
import React, { Fragment } from "react";
import { useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { setModalStates } from "redux/actions/appActions";
import { IStore } from "redux/interfaces/types";
import { Button, Dropdown, Form, Grid, Icon } from "semantic-ui-react";

const QueryBuilder = () => {

    const [rulesetList, setrulesetList] = useState([{ entity: "", condition: "", val: "" }]);
    const mainField = [
        {
            key: "fruit",
            text: "fruit",
            value: "fruit"
        },
        {
            key: "color",
            text: "color",
            value: "color"
        },
        {
            key: "taste",
            text: "taste",
            value: "taste"
        }
    ]

    const operation = [
        {
            key: "is ",
            text: "is ",
            value: "is "
        },
        {
            key: "is not ",
            text: "is not ",
            value: "is not "
        }
    ]
    const options = [
        {
            key: "apple",
            text: "apple",
            value: "apple"
        },
        {
            key: "yellow",
            text: "yellow",
            value: "yellow"
        },
        {
            key: "sweet",
            text: "sweet",
            value: "sweet"
        },
    ]

    const [dropDownOptions, setDropDownOptions] = useState(options);
    const [currentValue, setCurrentValue] = useState("");
    const handleAddition = (e: any, { value }: any) => {
        setDropDownOptions((prevOptions) => [
            ...prevOptions,
            { key: value, text: value, value },
        ]);
    };

    const handleChange = (e: any, { value }: any) => {
        setCurrentValue(value);
    }

    const handleRemoveClick = (index: number) => {
        const list = [...rulesetList];
        list.splice(index, 1);
        setrulesetList(list);

    };

    const handleAddClick = () => {
        setrulesetList([...rulesetList, { entity: "", condition: "", val: "" }]);
        setDropDownOptions(options)
    };

    const initialValues = {
        mainField : "",
        operation: "",
        resultant_value: ""
    }

    return (
        <Fragment>
            {rulesetList.map((x, i) => {
                return (
                    <Grid >
                        <Grid.Row className={"rulesetGrid fluid"} >
                            <Formik
                                initialValues={initialValues}
                                onSubmit={values => {
                                    console.log("here",values)
                                }}

                            >
                                {
                                    ({ handleSubmit, values, setValues }) => (
                                        <Form onSubmit={handleSubmit} className={"rulesetForm"}>
                                            {i == 0 ? <p className="condition"> If</p> : <p className="condition"> And</p>}

                                            <Dropdown
                                                name="mainField"
                                                className={"dropdown fieldDropdown"}
                                                widths={2}
                                                placeholder='Fruit'
                                                fluid
                                                selection
                                                options={mainField}
                                            />

                                            <Dropdown
                                                name="operation"
                                                className={"dropdown operationDropdown"}
                                                widths={2}
                                                placeholder='Operation'
                                                fluid
                                                selection
                                                options={operation}
                                            />
                                            <Dropdown
                                                name="resultant_value"
                                                className={"dropdown valueDropdown"}
                                                widths={1}
                                                placeholder='Value'
                                                fluid
                                                search
                                                allowAdditions
                                                selection
                                                multiple
                                                options={dropDownOptions}
                                                value={currentValue }
                                                onAddItem={handleAddition}
                                                onChange={handleChange}
                                            />

                                            {rulesetList.length - 1 === i && <Icon className={"Plus plusIcon"} onClick={handleAddClick} />}
                                            {rulesetList.length !== 1 && <Icon className={"LineThicknessMedium signal-danger crossIcon"} onClick={() => handleRemoveClick(i)} />}
                                        </Form>
                                    )
                                }
                            </Formik>
                        </Grid.Row>

                    </Grid>
                );
            }
            )}
            <div>
                <div style={{ marginTop: "1rem" }}>
                    <Button
                        floated="right"
                        type="submit"
                        variant="contained"
                        primary={true}
                    >
                        Submit
                    </Button>
                </div>
            </div>
        </Fragment>
    );

}
export default QueryBuilder
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-10 14:17:53

在您的代码中几乎没有什么东西需要更改。

  1. 在使用Formik时,不需要显式地维护状态以保存表单值。福米克会处理的。
  2. 您只是在更改值,而不是通知formik更改其状态。
  3. 由于您正在呈现字段数组,您可以使用Formik FieldArray组件,它附带了许多帮助程序,比如推送新行、删除行和更新每行中字段的值。
  4. 提交无法工作,因为在<Formik />组件之外有提交按钮。因此,单击submit按钮不会调用onSubmit of Formik

重构了您的代码以使用FieldArray。

工作码箱

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67888669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档