简体   繁体   English

使用复选框反应 TypeScript MultiSelector

[英]React TypeScript MultiSelector using checkbox

i am trying to create a search form using React typescript props event.I have acheived half of it but now stuck on an checkbox multiSelector where i have no idea how we can implement it.i have googled a lot but got nothing in return.我正在尝试使用 React typescript props 事件创建一个搜索表单。我已经实现了一半,但现在卡在一个复选框 multiSelector 上,我不知道如何实现它。我用谷歌搜索了很多但没有得到任何回报。 here is my code.这是我的代码。

I am using common typescript props event onChange for setting all the values inside my search Api Object.我正在使用常见的 typescript 道具事件 onChange 来设置我的搜索 Api Object 中的所有值。

can anyone help me out with code or docs how we can acheive multiSelector checkbox for React Typescript props event.任何人都可以用代码或文档帮助我如何实现 React Typescript 道具事件的 multiSelector 复选框。

1.here is my search for structure=> 1.这是我对结构的搜索=>

enter code here

let columns = useMemo(
    () => [
        {
            Header: "Name", accessor: "username",
            Cell: (props: any) => {
                if (authoritiesList.includes("USR-U")) {
                    let path = "/users/" + props.value;
                    return createClickableLink(path, props.value);
                } else {
                    return <>
                        <span>{props.row.original.username}</span>
                    </>
                }
            },
            FilterOptions: {
                FilterInput:
                    <input type="text" placeholder="Username..." />,
                overrideFilterLabel: "Username",
                overrideFilterAccessor: "username"

            }
        },


        {
            Header: "Role(s)", accessor: "roles", disableSortBy: true,
            Cell: (props: any) => {
                return <>
                    {props.row.original.roles.map((role: any) => {
                        return (
                            <div>
                                <span>{role}</span><br/>
                            </div>)
                    })}
                </>
            },
            FilterOptions: {
                FilterSelect:
                         roleData.items.map((curRole:any)=>{
                            return (
                                <input type="checkbox value= 
                                {curRole.name} /> 
               
                            )
                        })} ,
                overrideFilterLabel: "Roles",
                overrideFilterAccessor: "roles"
            }
        },

    
        },
    ], [customerData,roleData]
)



enter code here

const selector = (state: any) => state.users; const selector = (state: any) => state.users;

return (
    <div className="m-0 p-0 ">
        <section id="content-wrapper">

            <div className="row">
                <div className="col-lg-12 ml-auto">
                    <Breadcrumb crumbs={crumbs}/>
                    <div className="table_data mt-2">

                        {createSearchButton()}
                        {authoritiesList.includes("USR-C") && createAddButton("/users/create", "Add User")}

                        <DataTable columns={columns}
                                   fetchAction={userActions.getAllData as Dispatch<Action>}
                                   exportAction={userActions.exportData  as Dispatch<Action>}
                                   selector={selector}/>
                    </div>
                </div>
            </div>
        </section>
    </div>
);

} }

I want to handle multi selected checkbox event for this form in Typescript. all forms input tags are working currently but multiselected checkbox is not working for brining output to the query object.我想在 Typescript 中处理此表单的多选复选框事件。所有 forms 输入标签目前都在工作,但多选复选框无法将 output 放入查询 object。

here is my typescript code.这是我的 typescript 代码。

for (let column of tableColumns) {
    if (!column.FilterOptions) {
        column.FilterOptions = {};
    }

    if (column.FilterOptions?.FilterSelect) {
        column.FilterOptions.FilterSelect.props.onKeyPress = (event: KeyboardEvent) => {
            event.key === 'Enter' && setApplyFilter(true);
        }

        column.FilterOptions.FilterSelect.props.onChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
            updateFilterQuerySelect(column, filterQuery, setFilterQuery, event);
        }
    }

    if (column.FilterOptions?.FilterInput) {
        column.FilterOptions.FilterInput.props.onKeyPress = (event: KeyboardEvent) => {
            event.key === 'Enter' && setApplyFilter(true);
        }

        column.FilterOptions.FilterInput.props.onChange = (event: React.ChangeEvent<HTMLInputElement>) => {
            updateFilterQuery(column, filterQuery, setFilterQuery, event);
        }
    }
}

here is function updateFilterQuery这是 function updateFilterQuery

const updateFilterQuery = (column: DataTableColumn, filterQuery: any, setFilterQuery: Function, event: React.ChangeEvent) => { const updateFilterQuery = (column: DataTableColumn, filterQuery: any, setFilterQuery: Function, event: React.ChangeEvent) => {

let tempQuery: any = {...filterQuery};

let key: string = column.FilterOptions?.overrideFilterAccessor || column.accessor;
let value: any = event.target.value;

if (event.target.value == "on" && event.target.checked != undefined) {
    value = event.target.checked;
}

if (event.target.value == undefined) {
    delete tempQuery[key];
} else {
    key === 'phone' ? tempQuery[key] = getUnformattedPhoneNumber(value)
        :
        tempQuery[key] = value;
}

setFilterQuery(tempQuery);

} }

It is a search form and similary it is working same as for other forms as well th eonly part missing in this form is now multiselector which is not working.这是一个搜索表单,与其他 forms 的工作方式类似,而且此表单中唯一缺少的部分现在是不工作的多选器。

You have to separate selection state into a custom hook.您必须将选择 state 分离到自定义挂钩中。 A state is an array of selected items. state 是选定项目的数组。

CodeSandbox 代码沙盒

hooks.ts钩子.ts

import React, { useState } from "react";

export const useMultiselect = (initialValue: string[]) => {
  const [selected, setSelected] = useState<string[]>(initialValue);

  const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {
    const value = event.target.value;
    const index = selected.indexOf(value);
    if (index > -1) {
      setSelected([...selected.slice(0, index), ...selected.slice(index + 1)]);
    } else {
      setSelected([...selected, ...[value]]);
    }
  };

  const isSelected = (value: string) => {
    return selected.includes(value);
  };

  return { selected, isSelected, onChange };
};

App.tsx应用程序.tsx

import { useMultiselect } from "./hooks";

const data = ["Apple", "Orange", "Banana", "Pear", "Peach"];

export default function App() {
  const { selected, isSelected, onChange } = useMultiselect([]);
  return (
    <div>
      <div>Select your favorite fruites!</div>
      <ul style={{ listStyleType: "none" }}>
        {data.map((value) => (
          <li key={value}>
            <input
              id={value}
              type="checkbox"
              value={value}
              checked={isSelected(value)}
              onChange={onChange}
            />
            <label htmlFor={value}>{value}</label>
          </li>
        ))}
      </ul>
      <div>Selected: {selected.join()}</div>
    </div>
  );
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM