Приложение :
- Панель поиска с двумя полями ввода текста (input1, input2)
- Три кнопки: SearchX, SearchY, Очистить результаты
- Оба поиска могут принимать input1 и input2 в качестве параметров для получения двух разных результатов.
- Есть компонент результата, который принимает и входные данные, действие и визуализирует компонент поиска в зависимости от действия.
function TestComponent() {
const [input1, setInput1] = useState('');
const [input2, setInput2] = useState('');
const [action, setAction] = useState(null);
const onInput1Change = evt => setInput1(evt.target.value);
const onInput2Change = evt => setInput2(evt.target.value);
return (
<div>
<input type="text" value={input1} onChange={onInput1Change} />
<input type="text" value={input2} onChange={onInput2Change} />
<button type="button" onClick={() => setAction('SearchX')}>
SearchX
</button>
<button type="button" onClick={() => setAction('SearchY')}>
SearchY
</button>
<button type="button" onClick={() => setAction('Clear results')}>
Clear results
</button>
<ResultComponent input1={input1} input2={input2} action={action} />
</div>
);
}
function ResultComponent({ input1, input2, action }) {
if (action === 'SearchX') {
return <SearchX input1={input1} input2={input2} />;
}
if (action === 'SearchY') {
return <SearchY input1={input1} input2={input2} />;
}
if (action === 'Clear results') {
return null;
}
return null;
}
function SearchX({ input1, input2 }) {
const [result, setResult] = useState(null);
useEffect(() => {
// Fetch and process X-way to get the result. Using timeout to simulate that
const id = window.setTimeout(() => setResult(`Search X result with inputs: ${input1}, ${input2}`), 3000);
return () => window.clearInterval(id);
}, [input1, input2]);
return <div>{result}</div>;
}
function SearchY({ input1, input2 }) {
const [result, setResult] = useState(null);
useEffect(() => {
// Fetch and process Y-way to get the result. Using timeout to simulate that
const id = window.setTimeout(() => setResult(`Search Y result with inputs: ${input1}, ${input2}`), 3000);
return () => window.clearInterval(id);
}, [input1, input2]);
return <div>{result}</div>;
}
ReactDOM.render(<TestComponent />, document.getElementById('root'));
Задача :
Мы хотим, чтобы поиск инициировал только при нажатии кнопки . С помощью приведенного ниже кода, после первого результата поиска, как только вы измените свой ввод, компонент результата, как и ожидалось, будет повторно визуализирован, поэтому поиск снова начнется без нажатия кнопки
Шаги для воспроизведения проблемы:
- Введите «input1» в первом текстовом поле
- Введите «input2» во втором текстовом поле
- Нажмите «SearchX»
- Через 3 секунды вы должны увидеть что-то вроде «Поиск X результата с помощью входов: input1, input2»
- Изменить любое из полей ввода. Не нужно нажимать ввод.
- Через 3 секунды результат изменится без нажатия кнопки
Возможная опция :
Планирование использования React .memo ловит, чтобы сравнить действие prop перед обновлением компонента результата. Действие реквизита может изменяться только при нажатии кнопки и, следовательно, может решить проблему.
Вопрос :
- Есть ли какой-либо другой способ (любые другие хуки и c.) чтобы решить проблему?
- Или есть какой-то другой процесс / дизайн, которому я могу следовать, чтобы избежать памятки?