Я просто поэкспериментировал с хуками React, чтобы лучше понять его, и подошел к этому варианту использования, указанному ниже.
Итак, я хочу, чтобы Sample Component показывал значение в верхнем регистре text на первом рендере, иначе точное значение текста, полученное им
Теперь, чтобы достичь этого, я должен использовать два useEffect
- Чтобы сделать текст значение в верхнем регистре для первого рендера
- Для обновления значения text при изменении / обновлении реквизита
Что я понял, используя этот подход, мое состояние ( Я думаю ) будет обновляться дважды, то есть с помощью хуков useEffect. Кроме того, мне придется сохранить ту же последовательность эффектов-ловушек, так как они выполняются в последовательности, и изменение последовательности приведет к тому, что первый рендер будет выплевывать обычный корпус значения text
Что может быть другой (лучший) способ добиться этого?
const { useState, useEffect } = React;
const { render } = ReactDOM;
const upperCase = str => str.toUpperCase();
const Sample = ({ text }) => {
const [state, setState] = useState(upperCase(text));
useEffect(() => {
setState("text");
}, [text]);
useEffect(() => {
setState(upperCase(text));
}, []);
return (
<div>
<p>{state}</p>
</div>
);
};
const App = () => {
const [state, setState] = useState("Sample");
return (
<div>
<Sample text={state} />
{state}
<input value={state} onChange={e => setState(e.target.value)} />
<h3>App Component</h3>
</div>
);
};
render(<App />, document.body);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.11.0/umd/react-dom.production.min.js"></script>