当春季物品离开DOM时,什么也没有发生(没有离开动画)。
完整代码沙箱: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>
)
);
};
答案 0 :(得分:0)
您必须在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
答案 1 :(得分:0)
将您的过渡移至应用程序组件。过渡应该处理所有待办事项。这样,它可以控制进入和离开事件。
<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>
);
};
还要确保为过渡提供唯一的密钥。它有助于确定正在进入哪个组件,正在离开哪个组件。在示例中,我将待办事项文本用作键。