#javascript #reactjs #redux
#javascript #reactjs #redux
Вопрос:
Я новичок в этом, так что это может быть очень начинающий вопрос, но я надеюсь, что это может быть решение для хороших людей.
songData()
here возвращает массив из множества объектов song.
Вот почему [0]
здесь, в currentSong: { currentSongData: songData()[0] },
Это мое состояние redux:
const initState = {
allSongs: songData(),
currentSong: { currentSongData: songData()[0] },
isPlaying: false,
isLibraryOpen: false,
songTimer: [
{
currentTime: 0,
duration: 0,
},
],
};
Всякий раз, когда мне нужно получить доступ к чему-либо в текущей песне, я должен написать что-то вроде:
currentSong.currentSongData.name
или, если я определяю currentSong как currentSong: [songData()[0]],
тогда, как:
currentSong[0].name
Есть ли лучший способ определить состояние redux, в котором мне не нужно писать такие длинные вещи, когда я получаю доступ к данным?
Я хочу получить к нему доступ, написав
currentSong.name
Кстати, это структура объекта song.
{
name: 'Cold Outside',
cover: 'https://chillhop.com/wp-content/uploads/2020/09/09fb436604242df99f84b9f359acb046e40d2e9e-1024x1024.jpg',
artist: 'Nymano',
},
Комментарии:
1. было бы лучше записать результат songData() в переменную, чтобы избежать ненужного повторного запуска
Ответ №1:
Вы можете использовать нотацию распространения свойств
currentSong: { ...songData()[0] }
Комментарии:
1. Я бы предложил: currentSong: songData()[0]
2. Я согласен, это намного лучше)
3. @AlekseyPolonkaAlex Я сделал это в первый раз. Но я упоминал выше, что мне пришлось писать
currentSong[0].name
, чтобы получить доступ к имени
Ответ №2:
Я бы предпочел сохранить идентификатор ключа currentSong, из которого вы могли бы извлечь содержимое его данных allSongs
. в противном случае вы будете дублировать данные, чего лучше избегать. таким образом, в начальном состоянии у вас будет currentSongId: songData()[0].id
итак, как бы вы справились с этим в своих функциях? вы можете использовать useSelector . эта функция позволяет вам фильтровать ваши данные, чтобы вы правильно их использовали. в вашем функциональном компоненте вы бы извлекли:
// at your component function
const selectedSong = useSelector(state => state.allSongs.filter(({ id }) => id === state.currentSongId))
если вы прочтете ниже в useSelector docs, вы можете пойти дальше и запомнить его значение, чтобы избежать ненужных повторных отправлений в сочетании с повторным выбором другой библиотеки.