javascript - JSX 中的多个 if/else

标签 javascript reactjs jsx

我正在尝试增加 map() 中的变量在 jsx 中并基于它隐藏元素。我收到以下错误

Failed to compile.
Parsing error: Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...?

我认为这是困扰我的行

{myIncrement % 2 == 0 && <div data-key-id={row.key} key={row.key} className="">}

有什么想法吗? (我不是全职 React 开发人员,所以有点迷失在 jsx 中)

这是该部分的完整代码

{props.config.map(row => (
  (row.isRequired || props.data[row.key]) && 
     <React.Fragment>
        {row.isFullWidth ? 
          <div data-key-id={row.key} key={row.key} className="">
            <div className="">
              <div className="">some key</div>
                <div className="">some value</div>
            </div>
          </div>
         :
          <React.Fragment>
            {myIncrement % 2 == 0 && <div data-key-id={row.key} key={row.key} className="">}
              <div className="">
                <div className="">{row.key}:</div>
                <div className="">{row.value}</div>
              </div>
            {myIncrement % 2 == 0 && </div>}

            {myIncrement = !row.isFullWidth ? myIncrement + 1 : myIncrement}
          </React.Fragment>
         }
      </React.Fragment>
))}

最佳答案

第一个问题: map 周围缺少片段

基本上你不能有一个看起来像这样的 jsx

<foo/>
<bar/>

因为 React 无法知道根元素,它需要执行 React 魔法,将 JSX 转换为响应式(Reactive) HTML,而您需要拥有

<>
  <foo/>
  <bar/>
</>

<子> <><React.Fragment> 的简写

这就是有关相邻元素的错误消息的含义。您的 map 将创建相邻元素:

['a', 'b', 'c'].map(letter => <div>{letter}</div>)

will produce

<div>a</div>
<div>b</div>
<div>c</div>

要修复此错误,只需在 map 周围添加一个片段即可:

<>
  { props.config.map(row => (
    /* ... */
  )}
</>

第二个问题:无效的 JSX 语法

这是无效的 JSX:

{ myIncrement % 2 == 0 && <div data-key-id={row.key} key={row.key} className=""> }
  <div className="">
    <div className="">{row.key}:</div>
    <div className="">{row.value}</div>
  </div>
{myIncrement % 2 == 0 && </div>}

我知道它在编写时有意义,但它不会编译,因为 React 会尝试评估 myIncrement % 2 == 0 && <div data-key-id={row.key} key={row.key} className="">myIncrement % 2 == 0 && </div>分开,这是不可能的(还?)。

您可以获得类似如下的内容:

// define this part of the component somewhere
const Foo = ({ key, value}) => (
  <div>
    <div>{key}:</div>
    <div>{value}</div>
  </div>
);

// surround it or not by a div, depending on the increment value
{ myIncrement % 2 == 0 ? (
    <div data-key-id={row.key} key={row.key}>
      <Foo key={row.key} value={row.value}/>
    </div>
  ) : (
    <Foo key={row.key} value={row.value}/>
  )
}

关于javascript - JSX 中的多个 if/else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59967299/

相关文章:

javascript - 通过 URL 访问 razor 页面时,浏览器尝试从无效地址加载 JS 文件

javascript - 导航到另一个页面时,Angular 会复制 $scope

javascript - 为什么无法从另一个脚本文件访问 JavaScript 函数?

javascript - Redux-form:如何在向导表单上设置初始值?

node.js - 如何将 ES6 Node 和 jsx 代码编译为 ES5 vanilla JS

javascript - 如何只使用js来屏蔽图片?

reactjs - 如何从antd中的数据动态创建列?

javascript - 如何计算对象数组中的数字

typescript - StencilJS Prop 未填充在 JSX 中

reactjs - React/JSX attrs w/strings vs 大括号