使用React单击来自输入的值更新URL

时间:2017-03-16 08:44:29

标签: javascript reactjs ecmascript-6 react-router

我正在尝试获取要捕获的输入的值,然后使用该值更新部分URL,所有这一切都通过使用React,ES6等进行简单的单击。基本上是一个简单的搜索功能

所以我的组件看起来像这样:

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>
    )
  }
}

但这只是给了我很多错误,似乎不喜欢window.location。实现这一目标的最佳方法是什么?我正在使用react-router,所以如果有更好的方法,我也很高兴

4 个答案:

答案 0 :(得分:1)

您可以使用browserHistory.pushthis.context.router.push。 componentDidMount也是一个lifeCycle函数,不需要绑定,只执行一次。您还需要一个handleSearch函数和一个关于输入查询更改的onChange事件

&#13;
&#13;
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>
    )
  }
}
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以使用"browserHistory"中的'react-router',然后将新网址推送到此处:

browserHistory.push('/search/{this.state.query}/some-action')

答案 2 :(得分:0)

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

//如果存在“搜索”字符串,则从中构建参数   如果(urlQueryString){     const updateRegex =新的RegExp(([?&])${key}[^&]*);     const removeRegex =新的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}`;
}

}

///没有设置参数,所以我们不需要问号   return(参数=参数==='?'?'':参数); }

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

this.props.history.push(url);

答案 3 :(得分:0)

这对我来说是有效的,它带有react-hooks和react-router v5

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

 const history = useHistory();

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

请参阅https://reactrouter.com/web/api/Hooks