componentDidMount()中的setState

时间:2018-06-21 07:55:34

标签: react-native react-navigation

以下代码导致错误。用参数更新组件状态的正确方法是什么?

constructor(props) {
        super(props)

        this.state = {
            loading: true,
            title: 'Meny',
            id: null,
            data: [],
            currentMenuId: null,
            error: null,
            loadingMessage: 'Laddar innehåll...',
        };

        this.init();


    }

    init = () => {
        const params = this.props.navigation.state.params

        if(typeof(params) !== 'undefined') {
            this.setState('title', params.title);
            this.setState('id', params.id);
        }

        console.log(this.state);
    }

错误

Invariant Violation: setState(...): takes an object of state variables to update or a function which returns an object of state variables.

This error is located at:
    in Menu (at SceneView.js:10)
    in SceneView (at StackViewLayout.js:488)
    in RCTView (at View.js:60)
    in View (at createAnimatedComponent.js:154)
    in AnimatedComponent (at StackViewCard.js:12)
    in Card (at createPointerEventsContainer.js:28)
    in Container (at StackViewLayout.js:539)
    in RCTView (at View.js:60)
    in View (at StackViewLayout.js:434)
    in RCTView (at View.js:60)
    in View (at StackViewLayout.js:433)
    in StackViewLayout (at withOrientation.js:30)
    in withOrientation (at StackView.js:60)
    in RCTView (at View.js:60)
    in View (at Transitioner.js:169)
    in Transitioner (at StackView.js:22)
    in StackView (at createNavigator.js:57)
    in Navigator (at createKeyboardAwareNavigator.js:11)
    in KeyboardAwareNavigator (at createNavigationContainer.js:383)
    in NavigationContainer (at SceneView.js:10)
    in SceneView (at createTabNavigator.js:10)
    in RCTView (at View.js:60)
    in View (at ResourceSavingScene.js:14)
    in RCTView (at View.js:60)
    in View (at ResourceSavingScene.js:10)
    in ResourceSavingScene (at createBottomTabNavigator.js:86)
    in RCTView (at View.js:60)
    in View (at createBottomTabNavigator.js:77)
    in RCTView (at View.js:60)
    in View (at createBottomTabNavigator.js:76)
    in TabNavigationView (at createTabNavigator.js:127)
    in NavigationView (at createNavigator.js:57)
    in Navigator (at createNavigationContainer.js:383)
    in NavigationContainer (at App.js:40)
    in App (at registerRootComponent.js:35)
    in RootErrorBoundary (at registerRootComponent.js:34)
    in ExpoRootComponent (at renderApplication.js:33)
    in RCTView (at View.js:60)
    in View (at AppContainer.js:102)
    in RCTView (at View.js:60)
    in View (at AppContainer.js:122)
    in AppContainer (at renderApplication.js:32)

Menu.Component.setState
    react.development.js:241:102
Menu._this.init
    Menu.js:41:8
new
    Menu.js:32:7
<unknown>
    createClassProxy.js:98:23
instantiate
    createClassProxy.js:96:6
new
    <unknown file>:0
constructClassInstance
    ReactNativeRenderer-dev.js:6569:19
updateClassComponent
    ReactNativeRenderer-dev.js:8733:8
beginWork
    ReactNativeRenderer-dev.js:9580:15

2 个答案:

答案 0 :(得分:1)

嘿,我看到您的setState语法错误。

代替此

this.setState('title', params.title);
this.setState('id', params.id);

使用此

this.setState({
  title: params.title,
  id: params.id
});

答案 1 :(得分:1)

好!我想到了。无需在这里设置状态,我可以像这样使用getParam():

   static navigationOptions = ({ navigation }) => {
      return {
         title: navigation.getParam('title', ''),
            headerStyle: Styles.header,
            headerTintColor: Vars.colors.primary,
            headerTitleStyle: Styles.headerTitle,
         };
   };