最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Reactjs - modifying State and changing URL onChange - Stack Overflow

programmeradmin8浏览0评论

I am trying to change the state and URL onChange on a <Input type='select'>. (I am using reactstrap)

import React, {Component} from 'react'
import {
    Input,
} from 'reactstrap'

export default class NewPostComponent extends Component {
    constructor(props) {
        super(props)
        this.state = {
            selected: '',
        }
    }

    handleChange(event) {
        this.setState({
            selected: event.target.value,
        })
    }

    render() {
        return (
            <Input type='select' onChange={(e) => handleChange(e)}>
                <option>option 1</option>
                <option>option 2</option>
                <option>option 3</option>
                <option>option 4</option>
            </Input>
        )
    }
}

I am changing the state but the problem es at changing the URL. I have tried props.history.push but in handleChange as follows:

handleChange(event) {
    this.setState({
        selected: event.target.value,
    })
    this.props.history.push(`/${this.state.selected}/new/`)
}

This is the ERROR that I am getting

Uncaught TypeError: Cannot read property 'push' of undefined

console.log(this.props.history) is undefined.

I just need a way to change URL after setState occurs.

I am trying to change the state and URL onChange on a <Input type='select'>. (I am using reactstrap)

import React, {Component} from 'react'
import {
    Input,
} from 'reactstrap'

export default class NewPostComponent extends Component {
    constructor(props) {
        super(props)
        this.state = {
            selected: '',
        }
    }

    handleChange(event) {
        this.setState({
            selected: event.target.value,
        })
    }

    render() {
        return (
            <Input type='select' onChange={(e) => handleChange(e)}>
                <option>option 1</option>
                <option>option 2</option>
                <option>option 3</option>
                <option>option 4</option>
            </Input>
        )
    }
}

I am changing the state but the problem es at changing the URL. I have tried props.history.push but in handleChange as follows:

handleChange(event) {
    this.setState({
        selected: event.target.value,
    })
    this.props.history.push(`/${this.state.selected}/new/`)
}

This is the ERROR that I am getting

Uncaught TypeError: Cannot read property 'push' of undefined

console.log(this.props.history) is undefined.

I just need a way to change URL after setState occurs.

Share Improve this question edited Jul 14, 2018 at 10:53 Sreekar Mouli asked Jul 14, 2018 at 10:34 Sreekar MouliSreekar Mouli 1,4425 gold badges27 silver badges50 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 6

The history prop is only passed to the ponents that are given to Route ponents.

{/* The Login ponent will get the history prop */}
<Route path="/login" ponent={Login} />

You could use withRouter if you want the route props in a ponent that is not directly used for a Route.

Since setState is asynchronous, you can push to the history in the callback to setState to make sure the state has changed before you change the url.

class NewPostComponent extends Component {
    state = {
        selected: ''
    }

    handleChange(event) {
        this.setState({
            selected: event.target.value,
        }, () => {
            this.props.history.push(`/${this.state.selected}/new/`)
        })
    }

    render() {
        return (
            <Input type='select' onChange={(e) => handleChange(e)}>
                <option>option 1</option>
                <option>option 2</option>
                <option>option 3</option>
                <option>option 4</option>
            </Input>
        )
    }
}

export default withRouter(NewPostComponent)
发布评论

评论列表(0)

  1. 暂无评论