【问题标题】:Why am I getting an invalid value error?为什么我会收到无效值错误?
【发布时间】:2017-11-30 15:33:24
【问题描述】:

我不明白我是如何得到这个错误的(下图)。在我的LoginForm.js 文件中,当我在WebStorm IDE 中将鼠标悬停在onEmailChange(text) 上时,它会给我一个unresolved function or method call to onEmailChange() 错误。在我的index.js 文件中,没有任何错误被抛出。

我已经查看了这个问题,但它与我的问题并不完全相关。

我试过File > Invalidate Caches/Restart,但没用。

这里是App.js

import React, { Component } from 'react';
import {StyleSheet} from 'react-native';
import {Provider} from 'react-redux';
import {createStore} from 'redux';
import firebase from 'firebase';
import reducers from './reducers';
import LoginForm from './components/common/LoginForm';

class App extends Component {
    render() {
        return(
            <Provider style={styles.c} store={createStore(reducers)}>
                <LoginForm/>
            </Provider>
        );
    }
}

const styles = StyleSheet.create({
    c: {
        flex: 1
    }
});


export default App;

这里是LoginForm.js

import React, {Component} from 'react';
import {connect} from 'react-redux';
import {emailChanged} from 'TorusTeensApp/src/actions';
import {Text, StyleSheet, KeyboardAvoidingView, TextInput, TouchableOpacity} from 'react-native';

class LoginForm extends Component {
    render() {
        onEmailChange(text)
        {
            this.props.emailChanged(text);
        }

        return(
            <KeyboardAvoidingView style={styles.container}>
                <TextInput
                    style={styles.userInput}
                    onsubmitediting={() => this.passwordInput.focus()}
                    returnKeyType={"next"}
                    placeholder={"Email"}
                    label={"Email"}
                    keyboardType={"email-address"}
                    autoCorrect={false}
                    onChangeText={this.onEmailChange.bind(this)}
                    value={this.props.email}
                />

                <TextInput
                    style={styles.userInput}
                    ref={(userInput) => this.passwordInput = userInput}
                    returnKeyType={"go"}
                    placeholder={"Password"}
                    label={"Password"}
                    secureTextEntry
                />

                <TouchableOpacity style={styles.buttonContainer}>
                    <Text style={styles.buttonText}>Login</Text>
                </TouchableOpacity>

                <TouchableOpacity style={styles.buttonContainer}>
                    <Text style={styles.buttonText}>Create Account</Text>
                </TouchableOpacity>
            </KeyboardAvoidingView>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        padding: 20 // creates a gap from the bottom
    },

    userInput: {
        marginBottom: 20,
        backgroundColor: '#9b42f4',
        height: 40
    },

    buttonContainer: {
        backgroundColor: '#41bbf4',
        paddingVertical: 10,
        marginBottom: 20
    },

    buttonText: {
        textAlign: 'center',
        color: '#FFFFFF'
    }
});

const mapStateToProps = state =>  {
  return {
      email: state.auth.email
  };
};
export default connect(mapStateToProps, null, {emailChanged}) (LoginForm);

这里是index.js

import {EMAIL_CHANGED} from './types';

export const emailChanged = (text) => {
    return {
        type: 'EMAIL_CHANGED',
        payload: text
    };
};

export default emailChanged();

【问题讨论】:

  • 不应该是export default emailChanged;吗?如果包含(),则表示正在执行函数并导出对象。

标签: javascript ios reactjs react-native redux


【解决方案1】:

您的连接错误

connect(mapStateToProps, null, {emailChanged}) (LoginForm);

应该是这样的:

connect(mapStateToProps, 
       (dispatch) => ({emailChanged: (text) => dispatch(emailChanged(text))}) 
)(LoginForm);

以便您的操作真正被调度

正如 emed 在评论中发现的那样:

export default emailChanged;

没有括号。

【讨论】:

  • 我试过这个,但每当我写 export default emailChanged; 并将鼠标悬停在它上面时,它就会给我一个 unused default export emailChanged
  • 它应该没有括号句点。您还错过了如何使用连接的整个部分
【解决方案2】:

您在 render() 方法中定义了回调,而不是在类主体中。这样做:

class LoginForm extends Component {
    onEmailChange(text) {
            this.props.emailChanged(text);
    }        

    render() {
       return(...);
    }
}

您也不应该在render() 方法中绑定方法。在组件的构造函数中执行此操作:

class LoginForm extends Component {
    constructor(props) {
        super(props);
        this.onEmailChange.bind(this);
    }

    onEmailChange(text) {
        // do something
    }

    // other methods
}

或者如果你使用 babel 和 ES6,你可以用箭头函数定义你的回调,然后它会被自动绑定:

class LoginForm extends Component {

    onEmailChange = text => {
        // do something
    };

    // other methods
}

另请参阅react docs about autobinding

您的连接调用似乎也不正确。如果你想发送动作emailChanged,它必须是这样的:

const mapStateToProps = state =>  {
    return {
        email: state.auth.email
    };
};

const mapDispatchToProps = dispatch => {
    // this put a function emailChanged into your props that will dispatch the correct action
    emailChanged: text => dispatch(emailChanged(text))
}; 

const LoginFormContainer = connect(mapStateToProps, mapDispatchToProps)(LoginForm);    

export default LoginFormContainer;

【讨论】:

    【解决方案3】:

    connect 的第三个参数需要是一个函数,该函数知道如何将mapStateToPropsmapDispatchToPropsownProps 的输出合并到一个对象中,然后将其用作连接组件的道具。我认为您正在尝试将该操作传递给 mapDispatchToProps 参数,这是第二个参数而不是第三个参数。因此,根据我认为您正在做的事情,您可能希望将您的 connect 行更改为如下所示。

    export default connect(mapStateToProps, {emailChanged}) (LoginForm);
    

    然后,从您的操作文件中导出函数,而不是调用该函数的输出。

    export default emailChanged;
    

    请注意,我删除了括号,因此它不会被调用。

    然后让回调函数成为你的类的一个方法,并在构造函数中绑定它。

    constuctor(props) {
      super(props);
      this.onEmailChange = this.onEmailChange.bind(this);
    }
    
    onEmailChange(text) {
      this.props.emailChanged(text);
    }
    

    然后在该元素上更新 onChangeText

    onChangeText={this.onEmailChange}
    

    【讨论】:

    • 我知道你要去哪里,但这对我不起作用。
    • 将回调函数设为箭头函数。
    • 试过了,也没用。每当我将鼠标悬停在 export default emailChanged; 上时,我都会收到 unused default export emailChanged
    • 您可能必须将mapDispatchToProps 设为一个函数,然后将您的动作创建者包装在一个函数中,该函数调度调用动作创建者的输出。
    • 也尝试将回调函数作为类的方法。
    猜你喜欢
    • 2011-10-08
    • 2010-11-15
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 2022-01-18
    • 2018-06-14
    相关资源
    最近更新 更多