JSX for ... in循环

时间:2016-10-04 03:04:00

标签: javascript reactjs jsx

鉴于此对象:

lst socials = {
  foo: 'http://foo'
}

我想在JSX中循环它。这有效:

let socialLinks = []
let socialBar
for (let social in socials) {
  socialLinks.push(<li>
                     <a alt={social} href={socials[social]}>{ social }</a>
                   </li>)
}
if (socialLinks) {
  socialBar = <div className='align-bottom text-center'>
                <ul className='list-inline social-list mb24'>
                  {socialLinks}
                </ul>
              </div>
}

但这不是(社会未定义):

let socialBar
if (socials) {
  socialBar = <div className='align-bottom text-center'>
                <ul className='list-inline social-list mb24'>
                  for(let social in socials)
                  {<li>
                     <a alt={social} href={socials[social]}>{ social }</a> // social is undefined
                   </li>}
                </ul>
              </div>
}

第二个例子中social未定义的原因是什么?我假设内部括号有一个范围问题,但我没有成功修复它。

我可以使用对象键执行forEach,并按照此post进行操作,但这与我的工作示例没什么不同。

要清楚 - 我有它的工作,我只想在第二个例子中更清楚地确定范围问题(或语法错误)。

2 个答案:

答案 0 :(得分:4)

JSX只是糖被转化为React.createElement的一堆函数调用,你可以在这里找到文档:https://facebook.github.io/react/docs/top-level-api.html#react.createelement

ReactElement createElement(
  string/ReactClass type,
  [object props],
  [children ...]
)

基本上你的JSX来自

<div style="color: white;">
  <div></div>
</div>

React.createElement('div', { style: { color: 'white' } }, [
  React.createElement('div', {}, [])
])

出于同样的原因,你不能将循环传递给函数中的参数,你不能把循环放到JSX中。它最终看起来像

React.createElement('div', { style: { color: 'white' } }, [
  React.createElement('div', {}, for (;;) <div></div>)
])

完全没有意义,因为你不能将for循环作为参数传递。另一方面,map调用返回一个数组,这是React.createElement的第三个参数的正确类型。

React在一天结束时仍然是一个虚拟dom库,但JSX只是让它更熟悉。 hyperscript是vdom库的另一个很好的例子,但JSX不是标准的。他们的自述文件中的示例与没有JSX的反应类似:

var h = require('hyperscript')
h('div#page',
  h('div#header',
    h('h1.classy', 'h', { style: {'background-color': '#22f'} })),
  h('div#menu', { style: {'background-color': '#2f2'} },
    h('ul',
      h('li', 'one'),
      h('li', 'two'),
      h('li', 'three'))),
    h('h2', 'content title',  { style: {'background-color': '#f22'} }),
    h('p',
      "so it's just like a templating engine,\n",
      "but easy to use inline with javascript\n"),
    h('p',
      "the intension is for this to be used to create\n",
      "reusable, interactive html widgets. "))

答案 1 :(得分:3)

在你的JSX中你不能有for循环。因此,即使您的for循环周围有socials is an array,它也无法正常工作。而是使用下面代码中显示的地图。假设您的数据Object.keys(socials).map(function(key)){}而不仅仅是一个对象。

如果社交是一个对象,您需要使用class App extends React.Component { render() { let socialBar = null; let socials = [{ foo: 'http://foo' }] if (socials) { socialBar = <div className='align-bottom text-center'> <ul className='list-inline social-list mb24'> {socials.map(function(social, index) { return <li key={index}> <a alt={index} href={social.foo}>{ social.foo }</a> </li> }) } </ul> </div> } return ( <div>{socialBar}</div> ) } } ReactDOM.render(<App/>, document.getElementById('app'));

&#13;
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react-dom.js"></script>
<div id="app"></div>
&#13;
$parents=Parent::doesntHave('child')->get();
foreach($parents as $parent)
{
     $parent->delete();
}
&#13;
&#13;
&#13;