首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单击按钮后未重新呈现页面

单击按钮后未重新呈现页面
EN

Stack Overflow用户
提问于 2019-02-13 23:06:23
回答 1查看 65关注 0票数 0

我有一个react类组件,它使用react-masonry生成一个产品展示。我现在想添加过滤功能,过滤器选项显示为按钮,在每次单击时,页面元素都应该被过滤,砖石显示应该重新渲染。过滤器功能运行良好,但我无法让砖石重新渲染。

代码语言:javascript
复制
import React from 'react'
import PropTypes from 'prop-types'
import Masonry from 'react-masonry-component'
import Product from 'components/Product'


const masonryOptions = {
    transitionDuration: 0
};

class Gallery extends React.Component {
    constructor (props){
        super(props);
        this.state ={
            filter:props.filter,
            elements:props.elements,
            type:props.type,
        }
         this.handleFilterClick=this.handleFilterClick.bind(this)
    }


    handleFilterClick(filter){
        console.log(filter)

        this.setState({filter:filter})
        console.log(this.state.filter)
    }

    filterProducts (elements,filter){
        const filteredArray=elements.filter(function(el){
            for (let i in el.tags) { 
                if (el.tags[i].slug===filter){

                    return true;

                }

            } 
            return false
        })
        return filteredArray;
    }

    renderGallery(){
        const type=this.state.type
        const elements=this.state.elements
        var filter=this.state.filter
        const filteredElements = elements
        if (filter !=="*"){
            const filteredElements = this.filterProducts(elements,filter)
        }

        const childElements = filteredElements.map(function(element,key){

           if (element.mainPhoto!=null && element.isDogFood==type){
           return (

               <Product key={key} element={element}/>

            );} else{
                return null;
            }
        });
         return (



                <Masonry
                    className={'my-gallery-class'} // default ''
                    options={masonryOptions} // default {}
                    disableImagesLoaded={false} // default false
                    updateOnEachImageLoad={false} // default false and works only if disableImagesLoaded is false

                >
                 <div className="col-md-12">

                    <ul className="filter text-center text-inline">
                      <li>
                        <button data-filter="*" className="selected">Tüm Ürünler</button>
                      </li>
                      <li>
                        <button filter="nograin">Tahılsız</button>
                      </li>
                      <li>
                        <button filter="seafood">Deniz Mahsülleri</button>
                      </li>
                      <li>
                        <button filter="poultry">Beyaz Et</button>
                      </li>
                      <li>
                        <button filter="redmeat">Kırmızı Et</button>
                      </li>
                      <li>
                        <button filter="pate" onClick={() =>{this.handleFilterClick("pate")}}>Püre</button>
                      </li>
                    </ul>
                  </div>
                    {childElements}
                </Masonry>


        );

    }

    render() {
       return (
       this.renderGallery()
       )
    }

}

Gallery.propTypes={

    type: PropTypes.bool
}
export default Gallery
EN

回答 1

Stack Overflow用户

发布于 2019-02-14 00:36:12

constructor中使用getDerivedStateFromProps而不是使用道具

代码语言:javascript
复制
import React from 'react'
import PropTypes from 'prop-types'
import Masonry from 'react-masonry-component'
import Product from 'components/Product'


const masonryOptions = {
    transitionDuration: 0
};

class Gallery extends React.Component {
  constructor (props){
    super(props);
    this.state = {
      // Don't assign direct value in constructor as constructor function 
      // calls only at initialization
      filter:props.filter,
      elements:props.elements,
      type:props.type,
    }
    this.handleFilterClick=this.handleFilterClick.bind(this)
  }

  getDerivedStateFromProps (props, prevState) {
    if(//Put a valid condition) {
      return {
        filter: props.filter,
        elements: props.elements,
        type: props.type
      }
    }
    return {}
  }

  handleFilterClick(filter){
    console.log(filter)
    this.setState({filter:filter})
    console.log(this.state.filter)
  }

  filterProducts (elements,filter){
    const filteredArray=elements.filter(function(el){
      for (let i in el.tags) { 
          if (el.tags[i].slug===filter){
            return true;
          }
      } 
      return false
    })
    return filteredArray;
  }

  renderGallery(){
    const type=this.state.type
    const elements=this.state.elements
    var filter=this.state.filter
    const filteredElements = elements
    if (filter !=="*"){
        const filteredElements = this.filterProducts(elements,filter)
    }

    const childElements = filteredElements.map(function(element,key){

     if (element.mainPhoto!=null && element.isDogFood==type){
     return (
         <Product key={key} element={element}/>
      );} else {
        return null;
      }
    });
    return (
      <Masonry
        className={'my-gallery-class'} // default ''
        options={masonryOptions} // default {}
        disableImagesLoaded={false} // default false
        updateOnEachImageLoad={false} // default false and works only if disableImagesLoaded is false
      >
        <div className="col-md-12">
          <ul className="filter text-center text-inline">
            <li>
              <button data-filter="*" className="selected">Tüm Ürünler</button>
            </li>
            <li>
              <button filter="nograin">Tahılsız</button>
            </li>
            <li>
              <button filter="seafood">Deniz Mahsülleri</button>
            </li>
            <li>
              <button filter="poultry">Beyaz Et</button>
            </li>
            <li>
              <button filter="redmeat">Kırmızı Et</button>
            </li>
            <li>
              <button filter="pate" onClick={() =>{this.handleFilterClick("pate")}}>Püre</button>
            </li>
          </ul>
        </div>
        {childElements}
      </Masonry>
    );
  }

  render() {
   return (
     this.renderGallery()
   )
  }
}

Gallery.propTypes = {
  type: PropTypes.bool
}

export default Gallery
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54673310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档