反应中的双重条件渲染?

Posted

技术标签:

【中文标题】反应中的双重条件渲染?【英文标题】:Double conditional rendering in react? 【发布时间】:2020-11-02 12:07:15 【问题描述】:

我正在用 React 构建一个小型服装店应用程序,只是为了学习一些东西。我实现了按价格部分的过滤器,但我希望能够为所选价格范围内没有商品的情况编写条件,而不是页面为空白。

render() 
        const filteredOpt2 = this.state.items.filter(item => item.price <= 60);
        const filteredOpt3 = this.state.items.filter(item => item.price >= 60 && item.price <= 100);
        
        return (
              <div>
                    
                         this.state.selectedOption === "option1"
                         ? <ProductList products=this.state.items style=marginLeft: 0/>
                         : this.state.selectedOption === "option2"
                         ? <ProductList products=filteredOpt2 style=marginLeft: 0/>
                         : this.state.selectedOption === "option3"
                         ? <ProductList products=filteredOpt3 style=marginLeft: 0/>
                         : null
                    
              </div>
        )

我知道代码非常重复并且确实不理想,但我现在想不出更好的方法。

所以我想做的是,假设filteredOpt2导致一个空数组,我如何以及在哪里实现一个条件,如果发生这种情况,显示一个显示文本的p标签?

【问题讨论】:

【参考方案1】:

您可以提前进行过滤,例如在函数中,然后相应地呈现列表:

const filterItems = (items, filter) => 
    if (filter === "option1") return items;
    if (filter === "option2") return items.filter(item => item.price <= 60);
    if (filter === "option3") return items.filter(item => item.price >= 60 && item.price <= 100);
;
render() 
    const filtered = filterItems(this.state.items, this.state.selectedOption);
        
    return (
        <div>
            filtered.length === 0 ? (
                <p>No products</p>
            ) : (
                <ProductList products=filtered style=marginLeft: 0/>
            )
        </div>
    );

或者更好的是让ProductList 组件处理:

render()         
    return (
        <div>
            <ProductList 
                products=filterItems(this.state.items, this.state.selectedOption) 
                style=marginLeft: 0
            />
        </div>
    );

const ProductList = (products) => 
    if (products.length === 0) return <p>No products</p>;

    return ...
;

【讨论】:

【参考方案2】:

您正在通过道具将产品列表发送到ProductList 组件。在该组件中,您使用 props.products,您可以添加如下内容:

!props.products.length
  ? <p>No product matched the criteria</p> 
  : props.products.map(product => ... whatever your code is )

详细说明,如果products.length 为零,则显示“无产品”文本,否则显示产品。

【讨论】:

【参考方案3】:

如果不深入了解组件拆分的想法,您可以像这样在模板中添加条件

const filteredOpt2 = this.state.items.filter((item) => item.price <= 60);
  const filteredOpt3 = this.state.items.filter(
    (item) => item.price >= 60 && item.price <= 100
  );

  return (
    <div>
      this.state.selectedOption === "option1" ? (
        <ProductList products=this.state.items style= marginLeft: 0  />
      ) : this.state.selectedOption === "option2" ? (
        <>
          filteredOpt2.length > 0 ? (
            <ProductList products=filteredOpt2 style= marginLeft: 0  />
          ) : (
            <p>No items lower than 60</p>
          )
        </>
      ) : this.state.selectedOption === "option3" ? (
        <>
          filteredOpt3.length > 0 ? (
            <ProductList products=filteredOpt3 style= marginLeft: 0  />
          ) : (
            <p>No items between 60 and 100</p>
          )
        </>
      ) : null
    </div>

【讨论】:

以上是关于反应中的双重条件渲染?的主要内容,如果未能解决你的问题,请参考以下文章

如何在本机反应中进行条件渲染

反应多个子组件的条件渲染

条件渲染反应原生:只有其他部分正在工作

条件渲染表行反应

使用 OR 运算符反应条件渲染

javascript 反应条件渲染