2

I'm trying to get the value of an input to be captured and then to update part of the URL with that value, all by doing a simple on click with React, ES6 etc. Basically a simple search functionality

So my component looks something like this:

class SearchInput extends Component {
  constructor() {
    super()

    this.state = {
      query: ''
    }
  }

  componentDidMount = () => {
    const handleSearchURL = window.location('/search/'+this.state.query+'/some-action')
    this.setState({
      handleSearch: handleSearchURL
    })
  }

  queryChange = (evt) => {
    this.setState({query: evt.target.value})
  }

  render() {
    const { handleSearch, placeholder } = this.props
    return (
      <form>
        <input id="site-search" type="search" placeholder={placeholder} value={this.state.query} />
        <input type="submit" value="Search" onClick={this.handleSearch} />
      </form>
    )
  }
}

but this just gives me a lot of errors and it seems to don't like window.location. What's the best way to achieve this? I'm using react-router so I'm also happy if there is a better way with that

4 Answers 4

2

You can use "browserHistory" from 'react-router' and then push new url to here like this:

browserHistory.push('/search/{this.state.query}/some-action')
Sign up to request clarification or add additional context in comments.

1 Comment

1

You can use browserHistory.push or this.context.router.push. also componentDidMount is a lifeCycle function and doesnt require binding and is executed just once. You also need a handleSearch function and a onChange event on input query change

class SearchInput extends Component {
  constructor() {
    super()

    this.state = {
      query: ''
    }
  }
  static contextTypes = {
       router: React.PropTypes.object
   }
  
  handleSearch = () => {
         this.context.router.push(`'/search/${this.state.query}/some-action'`);
  }
  queryChange = (evt) => {
    this.setState({query: evt.target.value})
  }

  render() {
    const { handleSearch, placeholder } = this.props
    return (
      <form>
        <input id="site-search" type="search" placeholder={placeholder} value={this.state.query} onChange={this.queryChange} />
        <input type="submit" value="Search" onClick={this.handleSearch} />
      </form>
    )
  }
}

2 Comments

Doesnt' seem to work, I get "can't read property push of undefined" in the console when I submit
static contextTypes = { router: React.PropTypes.object } updated the answer check
1

This worked for me with react-hooks and react-router v5

import { useHistory } from 'react-router-dom';

 const history = useHistory();

const handleSubmit = (e) => {
    e.preventDefault();
    history.push(`/search/${input}`);
  };

see https://reactrouter.com/web/api/Hooks

Comments

0

function updateQueryStringParam(key, value, location) { const urlQueryString = location.search; const newParam = ${key}=${value}; let params = ?${newParam};

// If the "search" string exists, then build params from it if (urlQueryString) { const updateRegex = new RegExp(([?&])${key}[^&]*); const removeRegex = new RegExp(([?&])${key}=[^&;]+[&;]?);

if (typeof value === 'undefined' || value == null || value === '') {
  // Remove param if value is empty
  params = urlQueryString.replace(removeRegex, '$1');
  params = params.replace(/[&;]$/, '');
} else if (urlQueryString.match(updateRegex) !== null) {
  // If param exists already, update it
  params = urlQueryString.replace(updateRegex, `$1${newParam}`);
} else {
  // Otherwise, add it to end of query string
  params = `${urlQueryString}&${newParam}`;
}

}

// no parameter was set so we don't need the question mark return (params = params === '?' ? '' : params); }

const url = updateQueryStringParam('filter', inputValue, this.props.location);

this.props.history.push(url);

Comments

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.