javascript - JSX for...in 循环

标签 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>
}

但这不是 (social undefined):

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 那样做但这与我的工作示例没有太大区别。

需要说明的是——我让它工作了,我只是希望在我的第二个示例中更清楚地了解范围问题(或者语法错误,如果是的话)。

最佳答案

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 的 React 的样子:

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. "))

关于javascript - JSX for...in 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39843520/

相关文章:

java - 如何将 Java Calendar 和 Java Date 序列化为 Javascript Date

javascript - 与 Aurelia 的属性(property)变更订阅

javascript - 如何在 React 中将整数值从父 prop 传递到子 prop

javascript - 如何在 ReactJS 中单击时仅切换元素集合中的一个元素?

javascript - 无法在 react jsx 值 Prop 中重复十六进制 html 实体

Javascript - Opera 11.60 和 IE 8 上的排序功能问题

javascript - 通过 Google App Script 调用 AWS Lambda 函数

javascript - REACT - 将事件处理程序附加到 child

reactjs - 在mapDispatchToProps中绑定(bind) Action 参数

reactjs - 是否有用于 VS Code 的 JSX emmet 在 {} 中而不是引号中围绕 className