Я хочу создать компонент Person, который полностью контролируется его состоянием. Он также должен иметь возможность синхронизировать c изменение реквизита (firstName, lastName), передаваемое из его родительского компонента в состояние. У меня есть следующий код. Он выполняет то, что мне нужно, а именно синхронизирует реквизиты с состоянием и выполняет повторную визуализацию после изменения состояния.
Однако я заметил одну проблему - useEffect вызывается после обновления DOM, вызванного изменением родительского реквизита. Таким образом, первоначальный повторный рендер теряется, так как я хочу, чтобы он повторялся только после того, как useEffect будет вызван и состояние будет изменено.
import React,{useState, useEffect} from 'react';
const Person = ({firstName, lastName}) => {
const [name, setName] = useState(firstName + lastName)
useEffect(() => {
setName(firstName + lastName);
console.log("state changed!");
}, [firstName, lastName])
console.log("re-render!");
return <div>render {name}</div>;
}
export default Person;
Я создал простую демонстрацию здесь https://codesandbox.io/s/sparkling-feather-t8n7m , Если вы нажмете кнопку повторного рендеринга, в консоли вы увидите вывод ниже. Первый re-render!
вызван изменением реквизита, которого я хочу избежать. Есть идеи как этого добиться? Я знаю, что есть и другие решения, такие как полный контроль над ним, но я хотел бы знать, есть ли обходной путь для этого решения
re-render!
state changed!
re-render!