当前位置: 首页 > 知识库问答 >
问题:

设置状态不会更新该值

施同
2023-03-14

我对下拉菜单中的设置状态有问题。我在代码中使用了typescript。所选类别值不会更改,并且始终返回空字符串“”。我怎样才能解决这个问题?

import debounce from "lodash.debounce";
import { observer } from "mobx-react-lite";
import React, { SyntheticEvent, useContext, useState } from "react";
import {
  Dropdown,
  DropdownItemProps,
  DropdownProps,
  Form,
  InputOnChangeData,
  Popup,
} from "semantic-ui-react";
import { RootStoreContext } from "../../../app/stores/rootStore";

const regex = new RegExp("^[a-zA-Z0-9 ]+$");

interface IProps {
  loading: boolean;
}

const PurchaseDetailsFilter: React.FC<IProps> = ({ loading }) => {
  const rootStore = useContext(RootStoreContext);
  const {
    setFilter,
    itemCount,
    loadPurchaseDetails,
    categoryId,
    setCategoryId,
  } = rootStore.purchaseDetailStore;

  const { purchaseCategories } = rootStore.purchaseCategoryStore;

  const purchaseCategoriesList: any = purchaseCategories.map((data) => {
    return { key: data.id, text: data.name, value: data.id };
  });

  const categoryOptions: DropdownItemProps[] = [
    { key: "all", value: "all", text: "All" },
  ].concat(purchaseCategoriesList);

  const [selectedCategory, setSelectedCategory] = useState("");

  const [filterValid, setFilterValid] = useState(true);
  
  const f = debounce((value: string) => {
    if (value !== "" && !regex.test(value)) {
      setFilterValid(false);
      setFilter(value);
    } else {
      setFilterValid(true);
      console.log(loading);
      setFilter(value);     
      loadPurchaseDetails();
    }
  }, 500);

  const cat = debounce((value: string) => {    
    console.log(value);    
    setSelectedCategory(value as string);
    console.log(selectedCategory);
    setCategoryId((value ==="all" ? "" : value) as string);
    loadPurchaseDetails();        
  }, 500);

  const handleOnChange = (
    event: React.ChangeEvent<HTMLInputElement>,
    { value }: InputOnChangeData
  ) => {
    f(value);
  };

  let popupMessage = "";
  if (!filterValid) {
    popupMessage = "Invalid character.";
  } else if (itemCount === 0) {
    popupMessage = "No results found.";
  }
  
  const handleSelectedCategory = (
    event: SyntheticEvent<HTMLElement>,
    {value}: DropdownProps
  ) => {      
    console.log(value);    
    setSelectedCategory(String(value));
    console.log(selectedCategory);
    setCategoryId((value ==="all" ? "" : value) as string);
    loadPurchaseDetails();    
  };

  return (
    <Form>
      <Form.Group>
        <Form.Field>
          <Popup
            trigger={
              <Form.Input
                placeholder={"Enter a filter."}
                name={"filter"}
                error={!filterValid}
                label={"Filter"}
                onChange={handleOnChange}               
                icon={"search"}
                loading={loading}
              />
            }
            content={popupMessage}
            on={"click"}
            open={!filterValid || itemCount === 0}
            position={"right center"}
          />
        </Form.Field>
        <Form.Field style={{ marginLeft: "10em" }}>
          <label>Category</label>
          <Dropdown    
            //defaultValue="All"
            //value={categoryId}     
            value={selectedCategory}
            onChange={handleSelectedCategory}      
            //defaultValue={categoryOptions[0].value}              
            placeholder="Choose an category"
            options={categoryOptions}
            selection
          />
        </Form.Field>
        <Form.Field>
          <label>Project</label>
          <Dropdown placeholder="Choose an option" />
        </Form.Field>
        <Form.Field>
          <label>Supplier</label>
          <Dropdown placeholder="Choose an option" />
        </Form.Field>
      </Form.Group>
    </Form>
  );
};

export default observer(PurchaseDetailsFilter);

共有2个答案

羊舌青青
2023-03-14

请看下面的代码注释

const handleSelectedCategory = (
    event: SyntheticEvent<HTMLElement>,
    { value }: DropdownProps
) => {
    console.log(value); // If this value is string i.e "Hello World", then just call setSelectedCategory(value);
    setSelectedCategory(value as string); // Not required. Just call setSelectedCategory(value) if value is string.
    console.log(selectedCategory); 
    setCategoryId((value === "all" ? "" : value) as string); // Curious, where is setCategoryId froming from?
    loadPurchaseDetails();
};
祁鸿哲
2023-03-14

也许你要找的是这个:

      const handleSelectedCategory = (
        event: SyntheticEvent<HTMLElement>,
        {value}: DropdownProps
      ) => {      
        console.log(value);    
        setSelectedCategory(String(value));
        console.log(selectedCategory);
        setCategoryId(String(value ==="all" ? "" : value));
        loadPurchaseDetails();      
      };

请注意,我将值更改为字符串字符串(值)。我曾经摆弄过TypeScript,但我忘记了字符串的转换是如何工作的。您可以在这里找到更好的解释:https://stackoverflow.com/a/32607656/7467018

 类似资料:
  • 我想问一下,为什么在执行事件时,我的状态没有改变。我已经搜索到需要在构造函数中绑定函数,但是状态仍然没有更新。 下面是我的代码:

  • 问题内容: 我想问为什么在执行onclick事件时状态没有变化。我已经搜索了一段时间,我需要在构造函数中绑定onclick函数,但状态仍未更新。这是我的代码: 问题答案: 这个回调真的很混乱。只需使用async await代替:

  • 问题内容: 我想问一下为什么在执行onclick事件时状态没有变化。我已经搜索了一段时间,我需要在构造函数中绑定onclick函数,但状态仍未更新。这是我的代码: 问题答案: 幸运的是, setState进行了回调。这是我们获取更新状态的地方。考虑这个例子。 因此,当回调触发时,this.state是更新后的状态。你可以在回调中获取突变/更新的数据。

  • 它几乎添加了一个对象,该对象包含来自主窗体的子窗体的值。 这是我用作按钮的函数的函数。 这将一个新对象添加到一个名为的状态,该状态是一个对象数组。 提前谢了。

  • 所以我有这个: 只是一个数组的数字例如然而没有给出正确的总数,但?我甚至放了一个超时延迟,看看这是否解决了问题。任何明显的还是我应该发布更多的代码?

  • 说明 支付宝境外到店支付-更新商户二维码状态 官方文档:https://global.alipay.com/service/merchant_QR_Code/34 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayCrossBorder\InStore\ModifyStatus\Request 属性 名称 类型 说明 $service string 接口名称 $timesta