【问题标题】:Dropdown/Select Value Not Changing - useState下拉/选择值不变 - useState
【发布时间】:2020-06-15 05:22:17
【问题描述】:

我的下拉菜单(材料 UI 选择)显示“搜索依据”,然后我们单击它,它会给出一个列表。当我选择一个选项时,我想存储该选项并将“搜索依据”更改为所选选项。

export default function UserSearchPage(){
  const [criteria, setCriteria] = useState('');
  const [searchItem, setSearchItem] = useState('');
  return (
    <div>
      <div className='main-content'>
        <Select 
        value = {criteria}
         onChange={value => {
          setCriteria(value);}}
        displayEmpty>
          <MenuItem disabled value="">
            <em>Search By</em>
          </MenuItem>
          <MenuItem value={1}>First Name</MenuItem>
          <MenuItem value={2}>Last Name</MenuItem>
          <MenuItem value={3}>Phone Number</MenuItem>
          <MenuItem value={4}>Email</MenuItem>
        </Select>
        <br></br><br></br>
         <SearchBar
         value= {searchItem}
         onChange={value => {
          setSearchItem(value);}}
            onRequestSearch={() => console.log('onRequestSearch')}
            style={{
              margin: '0 auto',
              maxWidth: 800
            }}
          />
            </div>
          )
    </div>
  );
}

在 Select 上使用我当前的 onChange,我在值上收到此错误:

Argument of type 'ChangeEvent<{ name?: string | undefined; value: unknown; }>' is not assignable to parameter of type 'SetStateAction<string>'.
  Type 'ChangeEvent<{ name?: string | undefined; value: unknown; }>' is not assignable to type '(prevState: string) => string'.

如果我使用这个 onChange:

onChange={event => setCriteria(event.target.value)}

我收到一个错误:

Argument of type 'unknown' is not assignable to parameter of type 'SetStateAction<string>'.
  Type 'unknown' is not assignable to type '(prevState: string) => string'.

我尝试创建一个沙盒,但我不知道如何解决该错误。代码看起来不错,但无法编译: https://codesandbox.io/s/sleepy-buck-5t7bq

【问题讨论】:

  • 我没有看到 Select 组件的更改处理程序?你的沙盒也坏了。
  • 我在尝试onChange={e =&gt; setCriteria(e.target.value)} but that didn't make any difference. @BrianThompson
  • 与什么没有区别?在给定的代码中,您仅使用 criteria 作为选择值
  • 因为“搜索依据”仍然没有改变,所以我只是删除了链接,假设它是错误的/无用的@BrianThompson
  • 您将 100% 需要 on change 处理程序,猜测菜单项可能不会返回任何内容。如果您可以修复 codepen,我们可能会提供更好的帮助。跨度>

标签: javascript reactjs typescript react-native material-ui


【解决方案1】:

当使用选择或任何输入字段时,您需要添加 onChange 函数以更新状态中的值。您通常还应该坚持使用受控输入或不受控制的非混搭。

我已经修复了您的 codepen 并更新了用作受控输入的代码。

https://codesandbox.io/s/blissful-payne-frsnt?fontsize=14&hidenavigation=1&theme=dark

import React, { useState } from "react";
import SearchBar from "material-ui-search-bar";
import { MenuItem, Select, Typography } from "@material-ui/core/";
import MuiThemeProvider from "material-ui/styles/MuiThemeProvider";

export default function App() {
  const [criteria, setCriteria] = useState("1");
  const [searchItem, setSearchItem] = useState("");
  console.log(criteria);
  return (
    <MuiThemeProvider>
      <div className="main-content">
        <Select
          displayEmpty
          onChange={e => setCriteria(e.target.value)}
          defaultValue={criteria}
        >
          <MenuItem disabled value="">
            <em>Search By</em>
          </MenuItem>
          <MenuItem value={1}>First Name</MenuItem>
          <MenuItem value={2}>Last Name</MenuItem>
          <MenuItem value={3}>Phone Number</MenuItem>
          <MenuItem value={4}>Email</MenuItem>
        </Select>
        <br />
        <br />
        <SearchBar
          value={searchItem}
          onChange={value => {
            setSearchItem(value);
          }}
          onRequestSearch={() => console.log("onRequestSearch")}
          style={{
            margin: "0 auto",
            maxWidth: 800
          }}
        />
      </div>
    </MuiThemeProvider>
  );
}

【讨论】:

  • 感谢您的回答。我意识到我错误地为 javascript 创建了一个代码沙箱。我的原始代码在 Typescript 中,这就是为什么我在 e.target.value 上不断收到错误消息,即使我将文件从 .js 更改为 .tsx
  • 另外,你还记得 codepen 的问题是什么吗?
  • 您只需将代码包装在一个 中,我猜它为材料 ui 组件提供了所有主题。呃,我还没有真正使用过带有类型脚本的 React,所以在那个部门可能没有任何用处。
猜你喜欢
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多