parsing错误:相邻的JSX元素必须封装在封闭的标记中
我试图设置我的React.js应用程序,以便它只呈现如果我设置的variables是真实的。
我的渲染function设置的方式如下所示:
render: function() { var text = this.state.submitted ? 'Thank you! Expect a follow up at '+email+' soon!' : 'Enter your email to request early access:'; var style = this.state.submitted ? {"backgroundColor": "rgba(26, 188, 156, 0.4)"} : {}; return ( <div> if(this.state.submitted==false) { <input type="email" className="input_field" onChange={this._updateInputValue} ref="email" value={this.state.email} /> <ReactCSSTransitionGroup transitionName="example" transitionAppear={true}> <div className="button-row"> <a href="#" className="button" onClick={this.saveAndContinue}>Request Invite</a> </div> </ReactCSSTransitionGroup> } </div> ) },
基本上,这里的重要部分是if(this.state.submitted == false)部分(我希望当提交的variables设置为false时显示这些div)。
但是运行这个时,我得到了这个问题的错误:
Uncaught Error: Parse Error: Line 38: Adjacent JSX elements must be wrapped in an enclosing tag
这里有什么问题? 我可以用什么来完成这项工作?
你应该把你的组件放在一个封闭的标签之间。 也就是说:
//WRONG! return ( <Comp1 /> <Comp2 /> )
代替:
//Correct return ( <div> <Comp1 /> <Comp2 /> </div> )
React元素只能返回一个元素。 你必须用另一个元素标签来包装你的两个标签。
我也可以看到你的渲染函数没有返回任何东西。 这就是你的组件应该是这样的:
var app = React.createClass({ render () { /*React element can only return one element*/ return ( <div></div> ) } })
另外请注意,如果在重新调用的元素内部存在语句,则不能使用。
render: function() { var text = this.state.submitted ? 'Thank you! Expect a follow up at '+email+' soon!' : 'Enter your email to request early access:'; var style = this.state.submitted ? {"backgroundColor": "rgba(26, 188, 156, 0.4)"} : {}; if(this.state.submitted==false) { return <YourJSX /> } else { return <YourOtherJSX /> } },
回答这个问题迟到了,但是我想这会增加解释。
发生这种情况是因为你的代码中的任何地方都是同时返回两个元素。
例如
return( <div id="div1"></div> <div id="div1"></div> )
它应该被包装在一个父元素中。 例如
return( <div id="parent"> <div id="div1"></div> <div id="div1"></div> </div> )
更详细的解释
您的下面的jsx
代码得到转换
class App extends React.Component { render(){ return ( <div> <h1>Welcome to React</h1> </div> ); } }
进入这个
_createClass(App, [{ key: 'render', value: function render() { return React.createElement( 'div', null, React.createElement( 'h1', null, 'Welcome to React' ) ); } }]);
但是,如果你这样做
class App extends React.Component { render(){ return ( <h1>Welcome to React</h1> </div>Hi</div> ); } }
这被转换成这个(只是为了说明的目的,实际上你会得到error : Adjacent JSX elements must be wrapped in an enclosing tag
)
_createClass(App, [{ key: 'render', value: function render() { return React.createElement( 'div', null, 'Hi' ); return React.createElement( 'h1', null, 'Welcome to React' ) } }]);
在上面的代码中,您可以看到您正在尝试从方法调用返回两次 ,这显然是错误的。
如果你不想把它包装在另一个div作为其他答案已经build议,你也可以将其包装在一个数组中,它将工作。
// Wrong! return ( <Comp1 /> <Comp2 /> )
它可以写成:
// Correct! return ( [<Comp1 />, <Comp2 />] )
请注意,上面的内容会产生一个警告: Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of 'YourComponent'.
Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of 'YourComponent'.
这可以通过向组件添加一个key
属性来解决,如果手动添加它们就像添加它:
return ( [<Comp1 key="0" />, <Comp2 key="1" />] )
这里是一些关键的更多信息: http : //facebook.github.io/react/docs/multiple-components.html#dynamic-children
问题
parsing错误:相邻的JSX元素必须封装在封闭的标记中
这意味着您试图以不正确的方式返回多个兄弟JSX元素。 请记住,您不是在编写HTML,而是在JSX中! 您的代码从JSX转换成JavaScript。 例如:
render() { return (<p>foo bar</p>); }
将被转译成:
render() { return React.createElement("p", null, "foo bar"); }
正如您所看到的,尝试根据createElement()
工作方式返回多个同级组件时出现问题; 它只需要一个元素的参数并返回它。 从一个函数调用中无法expression返回两个或多个元素。
所以,如果你想知道为什么这个工程…
render() { return ( <div> <p>foo</p> <p>bar</p> <p>baz</p> </div> ); }
但不是这个…
render() { return ( <p>foo</p> <p>bar</p> <p>baz</p> ); }
这是因为在第一个片段中,两个元素都是<div>
元素的children
元素的一部分。 当他们是children
一部分,那么我们可以expression无限的兄弟元素。 看看这将如何transpile:
render() { return React.createElement( "div", null, React.createElement("p", null, "foo"), React.createElement("p", null, "bar"), React.createElement("p", null, "baz"), ); }
解决scheme
根据你正在运行的React版本,你有几个select来解决这个问题:
-
返回一个数组(仅React v16 +!)
从React v16开始,React Components可以返回数组。 这与早期版本的React不同,在这个版本中,你不得不将所有的兄弟组件包装在父组件中。
换句话说,你现在可以做到:
render() { return [<p key={0}>foo</p>, <p key={1}>bar</p>]; }
这个转换成:
return [React.createElement("p", {key: 0}, "foo"), React.createElement("p", {key: 1}, "bar")];
注意上面的返回数组。 从React版本16及更高版本开始,arrays是有效的React Elements。 对于早期版本的React,数组不是有效的返回对象!
另外请注意,以下内容无效 (您必须返回一个数组):
render() { return (<p>foo</p> <p>bar</p>); }
-
将元素包装在父元素中
另一种解决scheme涉及到创build一个将兄弟组件包装在
children
的父组件。 这是解决这个问题的最常见的方式,并且适用于所有版本的React。render() { return ( <div> <h1>foo</h1> <h2>bar</h2> </div> ); }
注意:再次看看这个答案的顶部,了解更多细节以及这个过程 。
根据React 16,我们可以将多个组件从渲染返回为一个数组。
(没有父div
),它将渲染组件作为一个大对象。
return ([ <Comp1 />, <Comp2 /> ]);
导入视图并在View
换行。 用div
封装不适合我。
import { View } from 'react-native'; ... render() { return ( <View> <h1>foo</h1> <h2>bar</h2> </View> ); }