【问题标题】:React - wrap multiple elements in parent nodeReact - 在父节点中包装多个元素
【发布时间】:2020-07-29 18:34:47
【问题描述】:

我有以下组成句子的单词数组:

let words = [
  {
    "start_time": "2.54",
    "end_time": "3.28",
    "alternatives": [
      {
        "confidence": "1.0",
        "content": "Hello",
        "__typename": "Alternative"
      }
    ],
    "type": "pronunciation",
    "__typename": "TranscriptItems"
  },
  {
    "start_time": null,
    "end_time": null,
    "alternatives": [
      {
        "confidence": "0.0",
        "content": ".",
        "__typename": "Alternative"
      }
    ],
    "type": "punctuation",
    "__typename": "TranscriptItems"
  },
  {
    "start_time": "3.29",
    "end_time": "3.52",
    "alternatives": [
      {
        "confidence": "1.0",
        "content": "This",
        "__typename": "Alternative"
      }
    ],
    "type": "pronunciation",
    "__typename": "TranscriptItems"
  }
]

我也有这个变量,其中包含从上面的单词中选择的 sn-ps 数组:

const snippets = [{ start: 2.54, end: 4.00, id: 12, snippetTitle: "This is the title" }];

现在我通过简单的.map 显示单词并为每个单词返回<span>s。

我想要完成的是:如果我当前的跨度在来自 snippets 变量的 sn-p 之间,请将其包装在另一个 div/组件中,以便我可以突出显示它。

因此,我可以将两个跨度都包装在一个新的包装器组件或 div 中,而不是 <span>Hello</span>.<span>This</span><Highlight><span>Hello</span>.<span>This</span></Highlight>

【问题讨论】:

  • 在.map函数中返回前加个条件?
  • 问题是高亮可能只匹配地图中的一部分元素

标签: javascript reactjs


【解决方案1】:

你可以使用reduce函数做这样的事情:

export default myComponent = () => {
    let cache = [];
    return (
        <>
            {myArray.reduce((accumulator, currentValue) => {
                if(!isInSnippets(currentValue)){
                    if(cache.length > 0){ // return the cached value for highlight
                       accumulator.push( (<Highlight>
                                             {cache.map((elt, i) => <span key={i}>{elt}</span>)
                                          </Highlight>));
                       cache = [];
                    }
                    accumulator.push(<span>{currentValue}</span>);
                }
                else cache.push(currentValue);
                return accumulator;
            }}
        </>
    )
}

累加器将包含一个 jsx 元素数组。常规元素将包含在 span 中,而 Highlighted 元素将一起包含在 Highlight 组件中。

我们将突出显示的元素存储在 cache 变量中。当我们面对一个“常规”元素时,我们会检查缓存中是否有东西。如果有,我们将它们全部放在一个高亮元素中,并将其添加到缓存中。然后我们添加“当前”常规值。

【讨论】:

  • 这个方法有效,但是当我试图让它递归时,我卡住了,不能让它与嵌套的 一起工作。例如,一个更大的亮点中可以有一个亮点。关于我如何做到这一点的任何提示?
  • 在什么条件下会嵌套高亮?嵌套高光的数量是否有限制?如果是,您可以有多个缓存变量。
  • 考虑在 1 到 60 秒之间有一个大的 sn-p,所以是 59 秒的 sn-p。在这个里面我可以有另一个,在第二个 10 到 20 之间。也许我可以在这里限制深度,但我仍然需要这种行为来有重叠的区域。
  • 您可以使用嵌套数组进行缓存。这会使 reduce 函数内部的检查更加复杂,但这就是想法。如果您没有找到方法,我认为您应该打开另一个问题(因为这不是最初的问题)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多