当前位置: 首页 > 知识库问答 >
问题:

循环中的JSX

华瀚漠
2023-03-14

鉴于这一目标:

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

第二个示例中未定义社交的原因是什么?我假设内括号存在范围界定问题,但我尚未成功修复它。

我可以用对象键做一个forEach,也可以像本文中那样做,但这与我的工作示例没有太大区别。

为了清楚起见,我在第二个示例中只想更清楚地说明作用域问题(或者语法错误,如果是的话)。

共有2个答案

竺捷
2023-03-14

在JSX中,不能有for循环。因此,即使您的for循环周围有{},它也不起作用。取而代之的是使用下面代码中所示的地图。假设您的数据社交是一个数组,而不仅仅是一个对象。

如果socials是一个对象,则需要使用对象。钥匙(社交)。映射(函数(键)){}

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'));
<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>
夏烨霖
2023-03-14

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循环作为参数传递。另一方面,映射调用返回一个数组,该数组是React.createElement的第三个参数的正确类型。

React最终仍然是一个虚拟dom库,但JSX只是让编写变得更加熟悉。hyperscript是vdom库的另一个很好的例子,但是JSX不是标准的。他们自述文件上的示例类似于React在没有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. "))
 类似资料:
  • 本文向大家介绍C#中for循环、while循环循环执行的方法,包括了C#中for循环、while循环循环执行的方法的使用技巧和注意事项,需要的朋友参考一下 先给大家介绍下C#中的循环执行for循环 在这一节练习中,我们向大家介绍一下C#中的另一种重要的循环语句,for循环。 表达式1:一般为赋值表达式,给控制变量赋初值; 表达式2:逻辑表达式,循环控制条件;当条件为真时,循环执行循环体中的语句。

  • 我正在编写一个计算e^x值的方法。我在python中实现它的方式如下。 这将很好地返回e^x的值。但是,当我尝试在c#中实现相同的方法时,它没有输出与python中相同的值。以下是c#中的实现。 起初,这段代码的输出是一个无穷大符号。为了解决这个问题,我只是减少了循环运行的次数。在c#中,循环只运行10次,代码的输出非常接近于python中循环运行100次的输出。我的问题是,在不同的编程语言中,两

  • 问题内容: 如果两个模块相互导入会怎样? 为了概括这个问题,Python中的循环导入又如何呢? 问题答案: 导入确实非常简单。只要记住以下几点: 和是可执行语句。它们在运行的程序到达该行时执行。 如果模块不在中,则导入将在中创建新的模块条目,然后在模块中执行代码。在执行完成之前,它不会将控制权返回给调用模块。 如果中确实存在一个模块,则无论导入是否完成执行,导入都会简单地返回该模块。这就是循环导入

  • 问题内容: 在下面的示例代码中,是否真的需要counter = 0,还是有更好,更多的Python方法来访问循环计数器?我看到了一些与循环计数器有关的PEP,但它们要么被延迟要么被拒绝(PEP 212 和PEP 281)。 这是我的问题的简化示例。在我的实际应用程序中,这是通过图形完成的,整个菜单必须每帧重新绘制一次。但这以易于复制的简单文本方式进行了演示。 也许我还应该补充一点,我正在使用Pyt

  • 问题内容: 如果我在一个循环中有一个循环,并且一旦满足一条语句,我想中断主循环,那我应该怎么做? 这是我的代码: 问题答案: 使用标记的中断: 另请参阅 Java代码中的“循环:”。 这是什么,为什么会编译? 文献资料

  • 问题内容: 在遍历列表的Python循环中,我们可以编写: 并巧妙地遍历列表中的所有元素。有没有办法知道循环中到目前为止我循环了多少次?例如,我要列出一个清单,在处理完10个元素之后,我想对它们进行处理。 我考虑过的替代方案可能是: 要么: 是否有更好的方法(就像)来获得到目前为止的迭代次数? 问题答案: pythonic的方法是使用: