【问题标题】:can't call redux action from form submit无法从表单提交调用 redux 操作
【发布时间】:2018-07-12 22:16:39
【问题描述】:

当我尝试提交搜索表单时,它不会调用搜索操作。 是因为我将搜索功能从一个组件传递到另一个组件时效率低下吗?有没有办法直接从导入中使用它?

如果我将 SearchBox 组件包含在 Nav 本身中,它就可以工作。

如果我在handleSubmit 中添加console.log(search),它会输出函数。

import { search } from './actions/userActions';

class Nav extends React.Component {
    render() {
        const { search, self } = this.props;

        return (
            self === null 
            ? <NavLoggedOut search={search} />
            : <NavLoggedIn search={search}
        )
     }
}

const NavLoggedOut = (props) => {
    .....
}

const NavLoggedIn = (props) => {
    return (
        <header>
            <SearchBox search={search} />
        </header> 
    )
}

class SearchBox extends React.Component {
    constructor() {
        super();  
        this.state = {
            name: ''
        }
    }

    handleChange = event => {
        this.setState({
            [event.target.id]: event.target.value
        });
    }

    handleSubmit = event => {
        event.preventDefault();
        this.props.search(JSON.stringify({name: this.state.name}))
    }

    render() {
        return (
            <form onSubmit={this.handleSubmit}>
                <input type="text" id="name" onChange={this.handleChange} placeholder="Search" />
                <button type="submit">search</button>
            </form>
        )
    }
}

const mapStateToProps = state => ({
    self: state.store.self
});

export default connect(mapStateToProps, {search})(Nav);

【问题讨论】:

    标签: reactjs redux react-redux


    【解决方案1】:

    尝试添加这几行

    import { bindActionCreators } from 'redux';
    
    ...
    
    function mapDispatchToProps(dispatch){
        return bindActionCreators({
           search
        }, dispatch);
    }
    
    export default connect(mapStateToProps, mapDispatchToProps)(Nav);
    

    现在您的search 操作应该可以使用this.props.search() 对组件Nav 使用

    如果需要参数,请记住传递参数(这取决于您如何编写 search 操作)

    【讨论】:

      【解决方案2】:

      在你的构造函数中添加这个

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

      和构造函数应该看起来像dis

      constructor(props) {
              super(props);  
              this.state = {
                  name: ''
              }
              this.handleChange = this.handleChange.bind(this);
              this.handleSubmit = this.handleSubmit.bind(this);
          }
      

      【讨论】:

      • 不会改变任何东西
      • 在 contructor 和 supe 中传递道具...我已经编辑了我的答案
      • 这就是我添加的内容。同样的事情
      • 假设您的班级搜索框位于不同的文件中。正如您从一个组件到另一个组件所提到的那样。如果您在一个文件中使用不同的文件,在一个文件中使用搜索框,那么您需要在搜索框文件中导入搜索操作而不是导航,并在构造函数和超级中传递道具
      • 当您在最后一行使用 mapdispatchtoprops 时导出默认连接(mapStateToProps,{search})(Nav); ...您需要在此文件中导入操作..并假设您也从 redux 导入了连接..如果不导入连接也
      猜你喜欢
      • 1970-01-01
      • 2018-12-08
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 2017-09-22
      • 1970-01-01
      相关资源
      最近更新 更多