【问题标题】:JSX: inline conditionally include elementJSX:内联有条件地包含元素
【发布时间】:2017-03-25 00:56:04
【问题描述】:

我正在使用 Bootstrap 3,并希望在创建 12 列后清除每个 .row。但是我的代码失败了,我得到了这个错误:

编译失败。 ./src/File/file.js 中的错误 语法错误:Unexpected token, expected , (145:56)

在这一行:{ index % 4 == 0 && <div className="row"> }

const TweetImageList = ({images, removeImage}) => {
    return (
        <div className="TweetImageList">

            <ReactCSSTransitionGroup transitionName="tweetImageTransition"
                                     transitionEnterTimeout={500}
                                     transitionLeaveTimeout={500}>
                {
                    images.map((image, index) => {
                        let column =
                            <div key={index} className="col-xs-3 tweet-image-wrapper">
                                <TweetImage
                                    image={image}
                                    removeImage={removeImage}
                                />
                            </div>;

                        return column;

                    })
                }
            </ReactCSSTransitionGroup>

        </div>
    );
};

是的,有时需要清除该行,因为它不像 BS 文档所暗示的那样“自我清除”。在这里阅读:https://stackoverflow.com/a/26445839/1736012

!!更新!!

我根据 Yo Wakitas 的建议更新了我的 jsx。浮动现在用行清除。但是过渡不再起作用了...有什么想法吗??????

const TweetImageList = ({images, removeImage}) => {
    return (
        <div className="TweetImageList">

            {
                _.chunk(images, 4).map((chunk, i) => {
                    return (
                        <div key={i} className="row spacing-bottom">

                            {
                                chunk.map((image, j) => {
                                    return (
                                        <div key={j} className="col-xs-3">

                                            <ReactCSSTransitionGroup transitionName="tweetImageTransition"
                                                                     transitionEnterTimeout={500}
                                                                     transitionLeaveTimeout={500}>
                                                <TweetImage
                                                    image={image}
                                                    removeImage={removeImage}/>
                                            </ReactCSSTransitionGroup>
                                        </div>
                                    )
                                })
                            }

                        </div>
                    )
                })
            }
        </div>
    );
};

removeImage()

removeImage(id) {
    this.setState({
        images: this.state.images.filter(function (img) {
            return img.id !== id;
        }),
        startValue: this.state.startValue + this.numPhotoChars
    });
}

【问题讨论】:

  • 尝试使用===
  • 你已经走了。 JSX 不是字符串,你需要使用完整的元素并且你只能从 .map 中返回一个元素
  • 也可以尝试用另一个组件封闭您的退货。返回 (
    { index % ... }
    )

标签: twitter-bootstrap reactjs twitter-bootstrap-3 react-jsx


【解决方案1】:

我建议把它写成三元组,如果index%4 === 0,则显示行包裹元素。否则,显示没有行 div 的 div。

{this.state.photos.map((image, index) => {
  const column =
    <div className="col-xs-3">
      <TweetImage 
        image={image} 
        index={index} 
        key={'image-' + index} 
        removeImage={this.removeImage}
      />
    </div>;
  return (
    index%12 === 0 
    ? <div className="row">
        {column}
      </div>
    : {column}
  );
  }
)}

编辑:根据您的评论,您似乎应该将您的 this.state.photos 分块为长度为 4 的数组数组,然后对其进行映射。 If you are already using lodash as a utility library, you can use the chunk function 像这样:

  {_.chunk(this.state.photos, 4).map((chunk, i) => 
    <div className="col-xs-3">
      {chunk.map((image, j) => 
        <TweetImage 
          image={image} 
          index={j} 
          key={'image-' + i + '-' + j} 
          removeImage={this.removeImage}
        />
      )}
    </div>
  )}

如果您不使用实用程序库,您可以创建自己的分区 this.state.photos 的函数。 Theres multiple examples of that here.

【讨论】:

  • 是的,但是一个 .row 应该围绕 4 个 .col-xs-4 div,而不是 1 个。问题似乎是,你不能用 JSX 编写部分标记,只能完整的封闭标签。 ..我需要每个索引> 0 && index%4 === 0打开一行,然后在打开新行之前再次关闭该行。
  • 我明白了。我更新了我的答案,为此提供了解决方案。您可以将数组分成 4 个一组,然后映射到该数组。
  • 哦,等等,过渡不再有效。任何想法?我将更新我的 jsx,以便您可以看到...
  • 您能解释一下您所说的不再有效是什么意思吗?你期待会发生什么,现在会发生什么?有没有错误?
  • ”部分用于图像的进入/离开过渡。这在我的样式表中被定义为 css 转换。我没有碰它,它在这个标记更改之前工作。您需要更多信息吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 2021-10-25
  • 2018-09-11
  • 1970-01-01
  • 2013-01-09
  • 2017-02-20
相关资源
最近更新 更多