【问题标题】:Why can't I use curly braces in the body of my Motion callback?为什么我不能在 Motion 回调的正文中使用花括号?
【发布时间】:2017-06-19 07:22:57
【问题描述】:

最简单的例子:

import {Motion, spring} from 'react-motion';
// In your render...
<Motion defaultStyle={{x: 0}} style={{x: spring(10)}}>
  {value => <div>{value.x}</div>}
</Motion>

如果我将 花括号 放在回调主体周围,这对我有用:

import {Motion, spring} from 'react-motion';
// In your render...
<Motion defaultStyle={{x: 0}} style={{x: spring(10)}}>
  { 
     (value) => { <div>{value.x}</div> }
  }
</Motion>

我得到一个不变的违规。我误解了这里发生的事情吗?如果我在回调中显式返回元素,我不会得到不变量违反,但动画不起作用。

【问题讨论】:

  • 我不知道运动,但我认为这些 XML 之类的标签应该进入您的渲染视图是否正确?而不是js文件?这就是为什么它有评论// In your render...
  • @evolutionxbox 在这种情况下,类似 XML 的标签在正确的位置。使用 React 的 JSX 时,您在 Javascript 源代码中包含标签,然后预处理器将它们转换为函数/对象,然后再解释代码。

标签: javascript react-motion


【解决方案1】:

Motion 组件需要一个函数作为它的唯一子级,这就是您在两个示例中提供的。 Motion 将使用更新的 x 值连续调用(或渲染)此函数,直到动画完成。

现在由提供的函数来返回 React 可以实际渲染的东西,即你的函数应该返回一个有效的 React 元素。

在您的第一个示例中,您实际上返回了一个有效元素:

<div>{value.x}</div>

使用 JSX 时,花括号用于嵌入 JS 表达式,表达式必须解析为值。但是在第二个示例中,您返回的 JS 表达式不能解析为任何内容,它只是“包含”一个元素:

{ <div>{value.x}</div> }

这基本上相当于在“普通”渲染方法中执行此操作:

render() {
  return (
    { <div>Content</div> }
  )
}

如果你出于某种原因想要将它包裹在花括号中,你必须确保它解析为 React 可以渲染的东西。或者,换句话说,你的表达式必须返回一个有效的 React 元素,例如:

{value => {return <div>{value.x}</div>}}

【讨论】:

  • 作为这个答案的附录,在我声称如果我“在回调中明确返回元素,它不会动画”的问题中,我是不正确的。正如@tobiasenderson 所说,我再次尝试了,它确实做到了。我显然做了一个愚蠢的动作。
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 2019-04-16
相关资源
最近更新 更多