React-Spring transition 'leave' 动画不工作
React-Spring transition 'leave' animation not working
当 spring 项离开 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>
)
);
};
您必须在 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
将您的过渡移动到应用程序组件。过渡应该处理所有的待办事项。这样它就可以控制进入和离开事件。
<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>
);
};
还要确保您为转换提供了一个唯一的密钥。它有助于决定哪个组件正在进入,哪个组件正在离开。我在示例中使用待办事项文本作为键。
当 spring 项离开 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>
)
);
};
您必须在 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
将您的过渡移动到应用程序组件。过渡应该处理所有的待办事项。这样它就可以控制进入和离开事件。
<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>
);
};
还要确保您为转换提供了一个唯一的密钥。它有助于决定哪个组件正在进入,哪个组件正在离开。我在示例中使用待办事项文本作为键。