0

I am trying to show my results from a JSON file only when the search button is clicked. What is the correct way to do it?

Right now as the user types a product the results are show. I have a simple filter, that is filtering the results, but I would like to make that only appear when the button is clicked. I only want to show results when the search button is clicked.

class App extends Component {

  constructor(props){
    super(props);
    this.state = { 
      value: '',
      list: []
    }

    this.handleChange = this.handleChange.bind(this);
    this.handleSearch = this.handleSearch.bind(this);

    this.refresh();
  }


  handleChange(event){
    this.setState({ ...this.state, value: event.target.value })
  }
  
  refresh(){
    axios.get(`${URL}`)
      .then(resp => this.setState({...this.state, value: '', list: resp.data}));
  }

  handleSearch(product){
    this.refresh();
  }
  
   render(){
    return(
      <div className="outer-wrapper">
        <Header />
        <main>
          <Container>
            <Row>
              <Col xs={12} md={12} lg={12} className="pl-0 pr-0">
                <SearchBar 
                  handleChange={this.handleChange}
                  handleToggle={this.handleToggle}
                  handleSearch={this.handleSearch}
                  value={this.state.value}
                />
                <SearchResultBar 
                  value={this.state.value}
                />
                <Filter />
              </Col>
            </Row>
            <ProductList 
              value={this.state.value}
              list={this.state.list}
            /> 
          </Container>
        </main>
      </div>
    )
  }
}

export default App;


class Search extends Component {
  constructor(props){
    super(props);
  }

  render(){
    return(
      <div className="search-input">
        <InputGroup>
          <Input placeholder='Enter Search' 
            onChange={this.props.handleChange}
            value={this.props.value}
            />
          <InputGroupAddon className='input-group-append'
            onClick={this.props.handleSearch}>
            <span className='input-group-text'>
              <i className="fa fa-search fa-lg fa-flip-horizontal"></i>
            </span>
          </InputGroupAddon>
        </InputGroup>    
      </div>
    )
  }
}

export default Search;


class ProductList extends Component {
  constructor(props){
    super(props);
    this.state = {
    }
  }


  render(){
    let filteredSearch = this.props.list.filter(
      (product) => {
        return product.title.indexOf(this.props.value) !== -1
      }
    )
    
    return(
      <Container>
        <Row>
          {
            filteredSearch.map(item => {
              return <Product {...item} key={item._id} />
            })
          }
        </Row>
      </Container>
    );
  }
}

export default ProductList;

As it stands, my list of products is being displayed in the app as soon as it loads. This seems something trivial, but I have been scratching my head in trying to solve it.

1 Answer 1

1

You're calling this.refresh() inside the constructor. So it gets run on mount.

Just remove it from the constructor and you should be fine.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks man. I didn't know that the constructor worked like that. I just have to make some changes now, so I can get the correct search, but that helped.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.