next.js React下拉列表未给出当前选定的项目

v1l68za4  于 2022-12-12  发布在  React
关注(0)|答案(2)|浏览(132)

我使用的是React/Nextjs v13,有一个下拉列表,如下所示:
第一个
问题是当我第一次选择一个项目时,console.log(selectedLevel)给予任何空字符串,这是级别的默认值,但是,当我第二次选择一个项时,它给出的是上一次选择的项的值!!即使我强制代码在记录selectedLevel的值之前等待一秒钟,它也会给予一个空字符串。我想知道为什么会这样,以及如何修复它。

qco9c6ql

qco9c6ql1#

我用基本的html css做了这个下拉菜单。它工作得很好。虽然我把它做得很通用,但你可以得到这个想法。

import React from "react";
import "./DropDownInput.css";

const DropDownInput = ({
  name,
  options,
  placeholder,
  onChange,
  selectClassName,
  divClassName,
  selectedValue,
  showPlaceholder = true,
  optionDisabledArr = [],
  required = false,
}) => {
  return (
    <div className={`dropdown ${divClassName}`}>
      <span
        className={`dropdown__arrow ${selectedValue && "dropdown__arrow--up"}`}
      />
      <select
        name={name}
        onChange={(e) => onChange(e.target.value)}
        className={selectClassName}
        selectedValue
        required={required}
      >
        {showPlaceholder && (
          <option disabled selected={!selectedValue ? true : false} value="">
            {placeholder}
          </option>
        )}
        {options.map((option) => (
          <option
            key={option.id || option.value}
            value={option.id || option.value}
            selected={selectedValue === (option.id || option.value)}
            disabled={
              optionDisabledArr.length > 0
                ? optionDisabledArr.indexOf(option.id) === -1
                  ? false
                  : true
                : ""
            }
          >
            {option.status || option.value || option.name}
          </option>
        ))}
      </select>
    </div>
  );
};

export default DropDownInput;

请看下面的截图。我希望它会工作尝试检查option标签中的selected部分
第一次

g2ieeal7

g2ieeal72#

您的实现在React中有一个问题。在React中,检查当前值的调用是同步的,而状态更新是异步的。

import * as React from 'react';
import './style.css';

export default function App() {
  const [selectedLevel, setSelectedLevel] = React.useState('');
  const onSelect = (event) => {
    console.log(event.target.value);
    setSelectedLevel(event.target.value); // doesn't change the current value
  };

  return (
    <div>
      <h1>{selectedLevel}</h1>
      <select onChange={onSelect}>
        <option value="L1">Level 1 \</option>
        <option value="L2">Level 2\</option>
        <option value="L3">Level 3\</option>
      </select>
    </div>
  );
}

尝试运行上面的代码。
进一步说明

function whatIsTheLevel(){
       console.log(selectedLevel); // gives noting in the first selec    
}

这是一个假设的函数,通过以同步方式运行它,将阻止正确的状态。

相关问题