首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rematch for Redux:在不同屏幕上很难看到状态

Rematch for Redux:在不同屏幕上很难看到状态
EN

Stack Overflow用户
提问于 2019-09-15 13:42:14
回答 1查看 1.5K关注 0票数 1

我是第一次为Redux而战。我正在使用重新匹配来重做我的应用程序,但是我不知道我是否正确地做了这些?如何/在何处触发还原剂和效果(重匹配文档中的步骤3)?当我在屏幕之间切换时,我看不到我的状态。政府似乎在重新设置。有人能帮帮我吗?我会非常感激的。

我跟踪了这个:https://github.com/rematch/rematch

下面是我的代码:

我的应用程序将变得更大,因此我将这些文件放在不同的文件中,以构建到models.js中。

存储/user.js

代码语言:javascript
复制
const user = {
    state: {},
    reducers: {
        login(payload) { return payload },
        email(state, payload) {
            return { ...state, payload }
        },
        password(state, payload) {
            return { ...state, payload }
        },
        username(state, payload) {
            return { ...state, payload }
        },
        fullname(state, payload) {
            return { ...state, payload }
        },
    }
}

export default user

store/index.js

代码语言:javascript
复制
import { init } from '@rematch/core'
import user from './user'

const models = {
    user,
}

const store = init({
    models,
})

export default store

App.js

代码语言:javascript
复制
import * as React from 'react';
import SwitchNavigator from './navigation/switchNavigator'
import { Provider } from 'react-redux'
import 'redux'
import store from './store/index'

export default class App extends React.Component {
  render() {
    return (
      <Provider store={store}>
        <SwitchNavigator/>
      </Provider>
    );
  }
}

navigation/switchNavigator

代码语言:javascript
复制
import * as React from 'react';
import TabNavigatorScreen from './tabNavigator'
import AuthNavigatorScreen from './authNavigator'
import { createAppContainer } from 'react-navigation';
import { createSwitchNavigator } from 'react-navigation-switch-transitioner'

const switchNavigator = createSwitchNavigator(
  {
    Home: { 
      screen: TabNavigatorScreen
    },
    Auth: { 
      screen: AuthNavigatorScreen
    }
  },
  {
    initialRouteName: 'Auth',
  }
);

export default createAppContainer(switchNavigator);

navigation/authNavigator

代码语言:javascript
复制
import * as React from 'react';
import LoginScreen from '../screens/login'
import SignUpScreen from '../screens/signup'
import MainScreen from '../screens/main'
import { createAppContainer } from 'react-navigation';
import { createStackNavigator } from 'react-navigation-stack';

const authNavigator = createStackNavigator(
  {
    Main: {
      screen: MainScreen,
      navigationOptions: {
        header: null,
      }
    },
    Login: {
      screen: LoginScreen,
      navigationOptions: {
        title: 'Login',
        headerTintColor: '#404040', 
        headerTitleStyle: {
          color: '#404040',
        },
        headerBackTitleStyle: {
          color: '#404040',
        },
        headerBackTitle: null,
      }
    },
    Signup: {
      screen: SignUpScreen,
      navigationOptions: {
        title: 'Sign Up',
        headerTintColor: '#404040',
        headerTitleStyle: {
          color: '#404040',
        },
        headerBackTitleStyle: {
          color: '#404040',
        },
        headerBackTitle: null,
      }
    }
  },
  {
    initialRouteName: 'Main',
  }
);

export default createAppContainer(authNavigator);

screens/signUp

代码语言:javascript
复制
import * as React from 'react';
import {
    TextInput,
    Text,
    KeyboardAvoidingView,
    SafeAreaView,
    TouchableOpacity,
    Alert,
}
    from 'react-native';
import styles from '../styles'
import { connect } from 'react-redux';
import '@expo/vector-icons';
import 'redux';

class Signup extends React.Component {
    render() {
        const { routeName } = this.props.navigation.state
        return (
            <SafeAreaView style={styles.container}>
                <KeyboardAvoidingView behavior='position'>
                    <Text style={styles.mainText}>
                        EMAIL
                    </Text>
                    <TextInput
                        style={styles.inputText}
                        editable={routeName === 'Signup' ? true : false}
                        value={this.props.user.email}
                        onChangeText={input => this.props.email(input)}
                    />
                    <Text style={styles.mainText}>
                        PASSWORD
                    </Text>
                    <TextInput
                        style={styles.inputText}
                        editable={routeName === 'Signup' ? true : false}
                        value={this.props.user.password}
                        onChangeText={input => this.props.password(input)}
                        secureTextEntry={true}
                    />
                    <Text style={styles.mainText}>
                        USERNAME
                    </Text>
                    <TextInput
                        style={styles.inputText}
                        value={this.props.user.username}
                        onChangeText={input => this.props.username(input)}
                    />
                    <Text style={styles.mainText}>
                        FULL NAME
                    </Text>
                    <TextInput
                        style={styles.inputText}
                        value={this.props.user.fullname}
                        onChangeText={input => this.props.fullName(input)}
                    />
                    <TouchableOpacity
                        style={styles.buttonLighGray}
                        onPress={() => Alert.alert('Sign up')}>
                        <Text style={styles.buttonDarkText}>
                            Accept & Sign Up
                        </Text>
                    </TouchableOpacity>
                </KeyboardAvoidingView>
            </SafeAreaView>
        );
    }
}

const mapState = (state) => ({
    user: state.user,
})

const mapDispatch = ({ user: { email, password, username, fullname }}) => ({
    email: () => email(),
    password: () => password(),
    username: () => username(),
    fullname: () => fullname(),
})

export default connect(mapState, mapDispatch)(Signup)

登录屏幕使用与注册屏幕相同的状态。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-15 15:29:18

状态永远不会改变,因为在分配操作时不传递任何参数。

代码语言:javascript
复制
const mapDispatch = dispatch => ({
  setEmail: mail => dispatch.user.email(mail)
})

每次在没有参数的情况下调用还原器之前调用一个函数。

关于你的再匹配模型。您的减速器不应该只返回...state和有效载荷。试着

代码语言:javascript
复制
const user = {
    state: {},
    reducers: {
        email(state, email) {
            return { ...state, email }
        },
        password(state, password) {
            return { ...state, password }
        },
        username(state, username) {
            return { ...state, username }
        },
        fullname(state, fullname) {
            return { ...state, fullname }
        },
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57944678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档