为什么我不能在我的 Motion 回调正文中使用大括号?
Why can't I use curly braces in the body of my Motion callback?
最简单的例子:
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>
我遇到了不变违规。我误解这里发生了什么吗?如果我明确 return 回调中的元素,我不会得到不变违规,但动画不起作用。
Motion 组件需要一个函数作为其唯一的子组件,这是您在两个示例中都提供的。 Motion 将使用更新后的 x 值连续调用(或渲染)此函数,直到动画结束。
现在取决于提供的函数 return React 可以实际呈现的东西,即你的函数应该 return 一个有效的 React 元素。
在您的第一个示例中,您实际上 return 正在创建一个有效元素:
<div>{value.x}</div>
在使用JSX时,大括号用于嵌入JS表达式,表达式必须解析为值。但是在你的第二个例子中,你正在 returning 一个不解析任何东西的 JS 表达式,它只是 "contains" 一个元素:
{ <div>{value.x}</div> }
这基本上等同于在 "normal" 渲染方法中执行此操作:
render() {
return (
{ <div>Content</div> }
)
}
如果你出于某种原因想要将它包裹在花括号中,你必须确保它解析为 React 可以呈现的内容。或者,换句话说,你的表达式必须 return 一个有效的 React 元素,例如:
{value => {return <div>{value.x}</div>}}
最简单的例子:
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>
我遇到了不变违规。我误解这里发生了什么吗?如果我明确 return 回调中的元素,我不会得到不变违规,但动画不起作用。
Motion 组件需要一个函数作为其唯一的子组件,这是您在两个示例中都提供的。 Motion 将使用更新后的 x 值连续调用(或渲染)此函数,直到动画结束。
现在取决于提供的函数 return React 可以实际呈现的东西,即你的函数应该 return 一个有效的 React 元素。
在您的第一个示例中,您实际上 return 正在创建一个有效元素:
<div>{value.x}</div>
在使用JSX时,大括号用于嵌入JS表达式,表达式必须解析为值。但是在你的第二个例子中,你正在 returning 一个不解析任何东西的 JS 表达式,它只是 "contains" 一个元素:
{ <div>{value.x}</div> }
这基本上等同于在 "normal" 渲染方法中执行此操作:
render() {
return (
{ <div>Content</div> }
)
}
如果你出于某种原因想要将它包裹在花括号中,你必须确保它解析为 React 可以呈现的内容。或者,换句话说,你的表达式必须 return 一个有效的 React 元素,例如:
{value => {return <div>{value.x}</div>}}