当前位置: 首页 > 知识库问答 >
问题:

这在React类函数[duplicate]中为null

葛志国
2023-03-14

我将我的React类从ES5重构到ES6,现在当我单击一个按钮调用this.state.dispatch(logIn(this.state.logIn))时,行开头的初始this为空。太奇怪了。

这是我的课:

class Home extends Component {
    constructor(props) {
        super(props);

        this.state = {
            panelIsOpen: false,
            registration: {},
            login: {},
        };
    }

    signUp() {
        this.props.dispatch(signUp(this.state.registration));

        this.setState({
            registration: {},
        });
    }

    logIn() {
        debugger; // this is `null here`
        this.props.dispatch(logIn(this.state.login));

        this.setState({
            login: {},
        });
    }

    togglePanel(e) {
        this.setState({ panelIsOpen: !this.state.panelIsOpen} );
    }

    render() {
        const {elements} = this.props;
        const {registration, login} = this.state;

        return (
            // some stuff 
        );
    }
};

Home.propTypes = {
    elements: React.PropTypes.array,
    dispatch: React.PropTypes.func,
    user: React.PropTypes.object,
};

const mapStateToProps = ({elements, auth}) => {
    return {
        elements: getElementsByKeyName(elements, 'visibleElements'),
        user: getLoggedInUser(auth),
    };
};

Home = DragDropContext(HTML5Backend)(Home);
export default connect(mapStateToProps)(Home);

单击登录按钮调用登录功能,但由于某种原因,thisnull

谢谢你看一下

共有2个答案

艾修然
2023-03-14

这(并非双关语)与ES6中函数的绑定方式有关。如果将方法作为道具传递给另一个组件,则不能保证它运行的上下文是正确的上下文(除非先绑定它)。下面是一篇文章,内容很长,但很有趣:http://reactkungfu.com/2015/07/why-and-how-to-bind-methods-in-your-react-component-classes/

简而言之,您有两种选择:

>

  • (很常见/流行)在构造函数中将你的方法绑定到这个。您可能不需要绑定所有方法——这取决于它们的使用方式。

    constructor(props) {
        super(props);
        this.state = {
            panelIsOpen: false,
            registration: {},
            login: {},
        };
        this.signUp = this.signUp.bind(this);
        this.signUp = this.logIn.bind(this);
        this.togglePannel = this.togglePannel.bind(this);
    } 
    

    将方法定义为箭头函数,它将为您将其绑定到当前范围-无需在构造函数中绑定它们:

    class Home extends Component {
        // ...
    
        signUp = () => {
            this.props.dispatch(signUp(this.state.registration));
    
            this.setState({
                registration: {},
            });
        }
    
        // ...
    }
    

  • 鄢子平
    2023-03-14

    React不会绑定添加到ES6类的方法的上下文,除非它们是标准React生命周期的一部分(componentWillReceivePropscomponentDidMount,等等)。

    这意味着您需要手动绑定this的值,用于您的SignUplogIntogglePanel方法,或者将它们声明为继承父上下文的箭头函数。

    1.

    constructor(props) {
      super(props);
      this.signUp = this.signUp.bind(this);
      this.logIn = this.logIn.bind(this);
      this.togglePanel = this.togglePanel.bind(this);
    
      this.state = {
        panelIsOpen: false,
        registration: {},
        login: {},
      }
    

    或者

    2.

    signUp = () => {
      this.props.dispatch(signUp(this.state.registration));
    
      this.setState({
        registration: {},
      });
    }
    
    // the same for logIn and togglePanel
    

    如需参考,请参阅文档。

     类似资料:
    • 我想从字符串中得到@后面的单词。“你好,我是@ayub,react的初学者”。要从@后面的字符串中获取该(ayub)。任何帮助。

    • 我有一个简单的React代码,如下所示: 在addWG函数中,"this"的值始终为空。我知道我可以通过绑定它来解决这个问题,但我的问题是为什么它首先是空的。

    • 我正在跟随一个关于Udemy的反应课程。现在我达到了我的代码的这一点 编译后,我遇到了这个错误消息,我不知道该怎么做或意思

    • 问题内容: 我有以下ReactJS类: 但是我有以下错误: 我不明白 这是调用静态函数的好方法吗?我认为react正在使用静态进行某些操作,但我不知道该怎么做。 问题答案: 需要在类而非实例上访问静态方法。因此,在您的情况下,请使用: 但是,静态方法将无法访问-基于上面的代码示例,我不认为您希望该方法是静态的。 更多:ES6中的静态成员

    • 为什么在派生类构造函数中调用超类构造函数时id的值为0?当创建子对象时,什么时候在堆中为该对象分配内存?在基类构造函数运行之后还是之前?

    • 问题内容: 在我的React组件中,我有一个带有onSubmit函数的表单 由于某种原因,当我使用表单onSubmit时不在范围内。当我在构造函数中时,道具会正常注销。 当我是窗口对象时。如何获得react组件的范围? 问题答案: 这是更广泛的问题,因为与此类似的行为在使用其他组件事件(例如onClick,onChange,onSubmit)时会注意到 在文档中有关于此的注释: https://f