axios 从APIMap到react

ma8fv8wu  于 5个月前  发布在  iOS
关注(0)|答案(2)|浏览(67)

下面是AddCourse.tsx上的代码。我想显示来自API的教师姓名。它在控制台日志上运行良好,但它没有显示在服务器选项中。

const [instructorOptions, setInstructorOptions] = useState<
    Array<{ id: string; value: string; label: string }>
  >([]);

const fetchOptions = async () => {
    try {
      const response = await axios.get(`${API_URL}/instructor`);
      const instructorList: Array<{ id: string; name: string }> =
        response.data.data.instructor_list;

      if (instructorList.length > 0) {
        const options = instructorList.map((instructor) => ({
          id: instructor.id,
          value: instructor.name,
          label: instructor.name,
        }));
        setInstructorOptions(options);
        console.log('options : ', options);
      }
    } catch (error) {
      console.error('Error fetching instructors:', error);
      // Handle error, set appropriate state if needed
    } finally {
      setLoading(false);
    }
  };

  useEffect(() => {
    fetchOptions();
  }, []);

  const handleSelect = (selectedOption: any) => {
    // Lakukan sesuatu dengan opsi yang dipilih, misalnya simpan di state
    console.log('Opsi yang dipilih:', selectedOption);
  };

个字符
这是InputDropDown组件:

import React, { useState } from 'react';
import Select from 'react-select';
import { BsTrash3 } from 'react-icons/bs';

function InputDropDown({ options, onSelect, text }: any) {
  const [optionsAvailable, setOptionsAvailable] = useState<string[]>(options);
  const [option, setOption] = useState<string[]>([]);
  const [selectedOption, setSelectedOption] = useState('');

  const handleSelectChange = (selectedOption: any) => {
    if (selectedOption && !option.includes(selectedOption)) {
      setOption((prevOptions) => [...prevOptions, selectedOption]);

      const updatedOptions = optionsAvailable.filter(
        (option: any) => option !== selectedOption,
      );

      setOptionsAvailable(updatedOptions);
    }
    setSelectedOption('');
  };

  const handleOptionRemove = (optionId: any) => {
    const updatedoptions = option.filter((item: any) => item.id !== optionId);
    console.log(updatedoptions);
    setOption(updatedoptions);

    //update options available
    const deletedOptions = options.filter((item: any) => item.id === optionId);
    setOptionsAvailable((prevOptions) => {
      const newOptions = [...prevOptions, ...deletedOptions];
      // Sort the newOptions array by id in ascending order
      newOptions.sort((a, b) => a.id - b.id);
      return newOptions;
    });
  };

  return (
    <>
      <label className="mt-3 mb-3 block text-black dark:text-white">
        {text}
      </label>
      <Select
        value={selectedOption}
        onChange={handleSelectChange}
        options={optionsAvailable}
        isSearchable={true} // Aktifkan fitur pencarian
        placeholder="Pilih salah satu..."
      />
      <br />
      {option.map((data: any) => (
        <div className="flex mt-3 flex-row gap-2" key={data.id}>
          <div className="bg-primary text-white rounded-md px-2 py-1">
            {data.value}
          </div>
          <button
            onClick={() => handleOptionRemove(data.id)}
            className="bg-[#EF4444] text-white rounded-md px-2 py-1"
          >
            <BsTrash3 />
          </button>
        </div>
      ))}
    </>
  );
}

export default InputDropDown;


即使在console.log中出现选项,选项也不会出现:


的数据
如何使我的代码可以在选项中显示导师的名字?

uujelgoq

uujelgoq1#

你可以试试这个,我希望这个能解决问题

<div className="input-instructor">
  {instructorOptions && (
    <InputDropDown
      options={instructorOptions}
      handleSelect={handleSelect}
    />
  )}
</div>

字符串

lsmd5eda

lsmd5eda2#

从API中获取讲师后,需要确保martorOptions状态正确更新。fetchOptions函数似乎是正确的,当martorOptions状态发生变化时,InputDropDown组件可能不会重新渲染。
我更新了代码片段,试试这个:

const [instructorOptions, setInstructorOptions] = useState<
  Array<{ id: string; value: string; label: string }>
>([]);

const fetchOptions = async () => {
  try {
    const response = await axios.get(`${API_URL}/instructor`);
    const instructorList: Array<{ id: string; name: string }> =
      response.data.data.instructor_list;

    if (instructorList.length > 0) {
      const options = instructorList.map((instructor) => ({
        id: instructor.id,
        value: instructor.name,
        label: instructor.name,
      }));
      setInstructorOptions(options);
      console.log('options : ', options);
    }
  } catch (error) {
    console.error('Error fetching instructors:', error);
  } finally {
    setLoading(false);
  }
};

useEffect(() => {
  fetchOptions();
}, [instructorOptions]);

const handleSelect = (selectedOption: any) => {
  console.log('Opsi yang dipilih:', selectedOption);
};

个字符

相关问题