【问题标题】:React and TypeScript - How to render without wrapping in a parent div?React 和 TypeScript - 如何在不包装父 div 的情况下进行渲染?
【发布时间】:2018-08-16 12:39:44
【问题描述】:

我知道已经有很多和我一样的问题了(比如this one..) 但我找不到完美的答案。

我必须做什么

React v.15.6.2

我必须使用 JQuery Accordion 呈现按类别排序的几个元素,如下图所示:

这是我的渲染函数:

public render():React.ReactElement<{}>{
  return (
    <div className={styles.extensionContainer}>
    /* TONS OF DIV WITH CONTENT*/
    <div className="accordion">
       {this.state.items.map((item:CategoryArray)=>
          <h3>{item.CategoryName}</h3>
          <div className={styles.answers}>
              {item.Items.map((x)=> 
                  <h3>{x.ItemTitle}</h3>
                  <div className={styles.answer} dangerouslySetInnerHTML={{__html: x.ItemAnswer}}></div>
               )}
          </div>
        )}
    </div>
    </div>

  );
}

但不幸的是,它无法正常工作,并且构建会引发以下错误:

错误 TS2657:JSX 表达式必须有一个父元素。 错误 TS2695 : 逗号运算符的左侧未使用且没有副作用

我尝试了什么:

  1. 起初,我将我的第一个 .map() 结果包装成 <div className="accordion">,但我的 jQuery Accordion 小部件有点 因此被窃听。这促使我寻找另一种解决方案。
  2. 我试图只用一个简单的&lt;div&gt; 来包装它,但它绝对是 没有正确渲染我的手风琴。
  3. 我试图把它包裹在&lt;&gt;&lt;/&gt;(如this thread的答案中所述
  4. 我什至尝试通过安装 Babel-cli 并导入 Fragment 来用 &lt;Fragment&gt;&lt;/Fragment&gt; 包装它,但也没有机会。

现在这让我没有更多的解决方案了。渲染不好,或者绝对错误,您对如何在不将每个项目都包装在 div 中的情况下渲染我的手风琴有任何想法吗?

非常感谢!祝你有美好的一天!

【问题讨论】:

  • 你试过这个codesandbox.io/s/j7857nkj89
  • 您可以使用React.Fragment
  • 没有Fragment 就无法做到这一点,但这需要升级到 React ^16.0。你的版本是什么?
  • 我认为你有一个错字{item/CategoryName}
  • @ArupRakshit :是的,我已经尝试过但无法使其工作(我必须导入哪个模块?)并且您的沙箱也会引发错误。

标签: jquery reactjs typescript rendering accordion


【解决方案1】:

问题是 React 15 特有的。可以从 render 返回一个组件数组以跳过 &lt;div&gt; 包装器,正如另一个答案所解释的那样。

React 16 具有 &lt;&gt;Fragment 组件,允许对多个组件进行分组。并非所有工具都支持&lt;&gt;,而Fragment can be polyfilled in React 15

这里是an example

import { Fragment } from "react-dot-fragment";

...

  <div className="accordion">
    {this.state.items.map((item: CategoryArray) => (
      <Fragment>
        {console.warn(item)}
        <h3>{item.CategoryName}</h3>
        <div>
          {item.Items.map(x => (
            <Fragment>
              <h3>{x.ItemTitle}</h3>
              <div dangerouslySetInnerHTML={{ __html: x.ItemAnswer }} />
            </Fragment>
          ))}
        </div>
      </Fragment>
    ))}
  </div>
);

【讨论】:

    【解决方案2】:

    你可以使用数组

      {this.state.items.map((item:CategoryArray)=> {
        return [<h3>{item.CategoryName}</h3>,
        <div className={styles.answers}>
              {item.Items.map((x)=> {
                  return [<h3>{x.ItemTitle}</h3>,
                  <div className={styles.answer} dangerouslySetInnerHTML={{__html: x.ItemAnswer}}></div>];
               })}
        </div>];
      })}
    

    demo

    【讨论】:

    • 嗨@madalinivascu!谢谢你的回答,但我不能在退货中使用退货,可以吗?
    • @Gaelle 它不在return 内。它在map 函数内。
    • 是的,但它仍然无法正常工作:{this.state.items.map((item:CategoryArray)=&gt; return [&lt;h3&gt;{item.CategoryName}&lt;/h3&gt; &lt;div className={styles.answers}&gt; .... 我遇到了几个错误:TS1005 : '{' 预期。错误 TS2657 JSX 表达式必须有一个父元素;错误 TS1128:声明或声明预期和 TS2695。
    • @Gaelle 是{this.state.items.map((item:CategoryArray)=&gt; [...]){this.state.items.map((item:CategoryArray)=&gt; { return [...] })。答案最初错过了括号,即使演示还可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2021-03-10
    • 2018-09-19
    相关资源
    最近更新 更多