渲染 React 组件时出现意外标记
Unexpected token when rendering React component
这是我的组件代码片段:
renderEditor() {
return (
<FroalaEditor
base='https://cdnjs.cloudflare.com/ajax/libs/froala-editor/2.3.4'
value={this.state.value}
/>
);
}
render() {
return (
{this.renderEditor()}
);
}
但是当我 运行 这段代码时,我在 {this.renderEditor()}
处得到了一个意外的标记错误。为什么会发生这种情况,我该如何解决?
您必须将方法调用包装在 JSX 元素中,否则 Babel 不会将 return 语句识别为 JSX,或者在这种情况下是内联 JSX 表达式。它不会将您的代码从 JSX 转换为纯 JavaScript,因此会出现错误。它实际上被解释为一个对象文字,而不是你期望的内联 JSX 表达式:
return (
{this.renderEditor()} //interpreted as an object literal, `return ({ ... })`
// ^ The . here is an unexpected token in an object literal hence the error
);
解决方案是将它包装在一个元素中以告诉 Babel 它是 JSX,因此它被转译并且 {}
被正确解释。
return (
<div>
{this.renderEditor()}
</div>
);
这将使方法的 return 值成为 <div>
的子值,并且不会被解释为对象文字。如果你只是 return 没有任何其他兄弟姐妹的方法调用,你可以只删除 ()
分组和 <div>
s 一起:
return this.renderEditor();
这将防止代码首先被解释为对象文字,并且将 return 方法的 return 值,即组件。
这也适用于其他情况,例如:
return (
{foo}
);
它被解释为一个对象,因为 ()
是分组运算符,并且只能包含表达式。对象字面量是一个表达式,因此具有 shorthand 属性的对象字面量是 returned。它脱糖并转译为:
return {
foo: foo
};
这不是有效的 React 元素或 null,因此发生错误。但是在这种情况下,如果 foo
不是一个有效的 React 元素,你 必须 将它包装在一个有效的 React 元素中——你不能只做 return foo
.如果 foo
是一个数组,你必须将它包装在诸如 <div>
之类的东西中,因为 render
必须 return 一个 React 元素或 null,而数组既不是.
这是我的组件代码片段:
renderEditor() {
return (
<FroalaEditor
base='https://cdnjs.cloudflare.com/ajax/libs/froala-editor/2.3.4'
value={this.state.value}
/>
);
}
render() {
return (
{this.renderEditor()}
);
}
但是当我 运行 这段代码时,我在 {this.renderEditor()}
处得到了一个意外的标记错误。为什么会发生这种情况,我该如何解决?
您必须将方法调用包装在 JSX 元素中,否则 Babel 不会将 return 语句识别为 JSX,或者在这种情况下是内联 JSX 表达式。它不会将您的代码从 JSX 转换为纯 JavaScript,因此会出现错误。它实际上被解释为一个对象文字,而不是你期望的内联 JSX 表达式:
return (
{this.renderEditor()} //interpreted as an object literal, `return ({ ... })`
// ^ The . here is an unexpected token in an object literal hence the error
);
解决方案是将它包装在一个元素中以告诉 Babel 它是 JSX,因此它被转译并且 {}
被正确解释。
return (
<div>
{this.renderEditor()}
</div>
);
这将使方法的 return 值成为 <div>
的子值,并且不会被解释为对象文字。如果你只是 return 没有任何其他兄弟姐妹的方法调用,你可以只删除 ()
分组和 <div>
s 一起:
return this.renderEditor();
这将防止代码首先被解释为对象文字,并且将 return 方法的 return 值,即组件。
这也适用于其他情况,例如:
return (
{foo}
);
它被解释为一个对象,因为 ()
是分组运算符,并且只能包含表达式。对象字面量是一个表达式,因此具有 shorthand 属性的对象字面量是 returned。它脱糖并转译为:
return {
foo: foo
};
这不是有效的 React 元素或 null,因此发生错误。但是在这种情况下,如果 foo
不是一个有效的 React 元素,你 必须 将它包装在一个有效的 React 元素中——你不能只做 return foo
.如果 foo
是一个数组,你必须将它包装在诸如 <div>
之类的东西中,因为 render
必须 return 一个 React 元素或 null,而数组既不是.