当春季项目留下dom nothing(无动画(时发生。
完整代码框:https://codesandbox.io/s/jzz6xv1y4w
const Todo = ({ todo, onDeleteClick }) => {
const transition = useTransition(todo, null, {
from: { opacity: 0, transform: "translateY(-10px)" },
enter: { opacity: 1, transform: "translateY(0)" },
leave: { opacity: 0, transform: "translateY(10px)" }
});
return transition.map(
({ item, props, key }) =>
item && (
<TodoContainer style={props} key={key}>
<span>{todo}</span>
<button onClick={onDeleteClick}>X</button>
</TodoContainer>
)
);
};
将过渡移至应用程序组件。过渡应处理所有戒酒。这样,它可以控制Enter并留下事件。
<div className="App">
<h1>Todo App</h1>
<input type="text" ref={ref} />
<input type="submit" onClick={() => addTodo(ref.current.value)} />
{/* */}
{transition.map(
({ item, props, key }, i) =>
item && (
<Todo
transition={props}
todo={item}
onDeleteClick={() => deleteTodo(i)}
key={key}
/>
)
)}
</div>
(;
TODO组件将更简单:
const Todo = ({ todo, onDeleteClick, transition }) => {
return (
<TodoContainer style={transition}>
<span>{todo}</span>
<button onClick={onDeleteClick}>X</button>
</TodoContainer>
);
};
还确保您为过渡提供了独特的钥匙。它有助于确定要输入哪个组件并离开哪个组件。我将托尔文字用作示例中的键。
这是一个示例:https://codesandbox.io/s/goofy-chaplygin-whvt4
您必须在transition.map
中渲染所有元素。现在,您将它们渲染在transition.map
之外,但将每个元素包裹在transition.map
中。您的Todo
元素在此处渲染和删除:
{todos.map((x, i) => (
<Todo todo={x} onDeleteClick={() => deleteTodo(i)} key={x} />
))}
,但必须在此处渲染并删除它们:
return transition.map(
({ item, props, key }) => (
<TodoContainer style={props} key={key}>
<span>{item}</span>
<button onClick={onDeleteClick}>X</button>
</TodoContainer>
)
);
您需要更改组件Todo
。它应该渲染所有项目。
我为您创建一个工作示例:https://codesandbox.io/s/trusting-dewdney-jerxy