2

当 spring 项目离开 DOM 时,什么也没有发生(没有离开动画)。

完整的 CodeSandbox: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>
      )
  );
};
4

2 回答 2

3

将您的过渡移动到应用程序组件。过渡应该处理所有的待办事项。这样它就可以控制进入和离开事件。

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

还要确保为转换提供唯一的密钥。它有助于确定哪个组件正在进入,哪些正在离开。我在示例中使用 todo 文本作为键。

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

于 2019-05-16T13:33:30.700 回答
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

于 2019-05-16T13:29:00.417 回答