Я использую redux toolkit.
Задача сделать один slice, но чтобы он был для каждого компонента на странице свой.
// components/Dropdown.js
import React, { useEffect } from "react";
import { useDispatch, useSelector } from "react-redux";
import {
fetchData,
selectOptions,
selectSelectedOption,
setSelectedOption,
toggleDropdown,
selectOpenDropdownId,
} from "@/store/drop";
const Dropdown = ({ dropdownId }) => {
const dispatch = useDispatch();
const options = useSelector(selectOptions);
const selectedOption = useSelector(selectSelectedOption);
const openDropdownId = useSelector(selectOpenDropdownId);
useEffect(() => {
dispatch(fetchData());
}, [dispatch]);
const handleSelectChange = event => {
dispatch(setSelectedOption(event.target.value));
};
return (
<div>
<h3 onClick={() => dispatch(toggleDropdown({ dropdownId }))}>
{selectedOption
? `Выбранная опция: ${selectedOption}`
: "Выберите опцию"}
</h3>
{openDropdownId === dropdownId && (
<div>
<label>Выберите опцию:</label>
<select value={selectedOption} onChange={handleSelectChange}>
{options.map(option => (
<option key={option.id} value={option.id}>
{option.name}
</option>
))}
</select>
</div>
)}
</div>
);
};
export default Dropdown;
// redux/dropdownSlice.js
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
export const fetchData = createAsyncThunk("dropdown/fetchData", async () => {
const response = await fetch("https://example.com/api/options");
const data = await response.json();
return data;
});
const dropdownSlice = createSlice({
name: "dropdown",
initialState: {
options: [],
selectedOption: "",
openDropdownId: null,
},
reducers: {
setSelectedOption: (state, action) => {
state.selectedOption = action.payload;
},
toggleDropdown: (state, action) => {
const { dropdownId } = action.payload;
state.openDropdownId =
state.openDropdownId === dropdownId ? null : dropdownId;
},
},
extraReducers: builder => {
builder.addCase(fetchData.fulfilled, (state, action) => {
state.options = action.payload;
});
},
});
export const { setSelectedOption, toggleDropdown } = dropdownSlice.actions;
export const selectOptions = state => state.dropdown.options;
export const selectSelectedOption = state => state.dropdown.selectedOption;
export const selectOpenDropdownId = state => state.dropdown.openDropdownId;
export default dropdownSlice.reducer;
Проблема заключается в том, что кликая на один список открывается и второй. Мне не нужно дублировать их. Мне нужно сделать два списка одинаковых и использовать в разных частях сайта. useState применять не хочу.