#reactjs #react-hooks
#reactjs #реагирующие перехваты
Вопрос:
Для этого accordin.js компонент, почему эта строка работает setActiveIndex(index);
Я думал, что мы присвоили вещи [1] объекту setActiveIndex , тогда почему мы можем вызывать объект setActiveIndex как функцию?
import React, { useState } from 'react';
const Accordion = ( { items }) => {
// const [activeIndex, setActiveIndex] = useState(null);
const things = useState(null);
const activeIndex = things[0];
const setActiveIndex = things[1];
const onTitleClick = (index) => {
console.log('Title clicked', index);
setActiveIndex(index);
}
const renderedItems = items.map((item, index) => {
return (
<React.Fragment key={item.title}>
<div
className="title active"
onClick={ () => onTitleClick(index)}
>
<i className="dropdown icon"></i>
{item.title}
</div>
<div className="content active">
<p>{item.content}</p>
</div>
</React.Fragment>)
});
return (<div className="ui styled accordion">
{renderedItems}
<h1>{activeIndex}</h1>
</div>);
};
export default Accordion;
Комментарии:
1. Это поможет
Ответ №1:
Перехваты useState возвращают массив с двумя элементами. Первый элемент — это текущее значение этого состояния. Второй элемент — это функция для обновления значения состояния.
Идиоматический способ написать это был бы const [activeIndex, setActiveIndex] = useState(null)
В коде аккордеона things
на самом деле есть массив с двумя вышеупомянутыми значениями. Следовательно things[1]
, это функция setActiveIndex
.
Ответ №2:
Согласно документации для useState
:
Что возвращает useState? Он возвращает пару значений: текущее состояние и функцию, которая его обновляет. Вот почему мы пишем
const [count, setCount] = useState()
. Это похоже наthis.state.count
иthis.setState
в классе, за исключением того, что вы получаете их в паре. Если вы не знакомы с синтаксисом, который мы использовали, мы вернемся к нему внизу этой страницы.
AFAIK более идиоматическая версия может выглядеть так:
const [activeIndex, setActiveIndex] = useState(); // null by default if not set
Это заменило бы эти строки, things
полностью исключив:
const things = useState(null);
const activeIndex = things[0];
const setActiveIndex = things[1];