React-Spring过渡“离开”动画不起作用

时间:2019-05-16 13:01:31

标签: reactjs react-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>
      )
  );
};

2 个答案:

答案 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>
  );
};

还要确保为过渡提供唯一的密钥。它有助于确定正在进入哪个组件,正在离开哪个组件。在示例中,我将待办事项文本用作键。

这是示例:https://codesandbox.io/s/goofy-chaplygin-whvt4