reactjs - 如何将 redux 信息传递给导航器函数?或者是否有不同的方法来创建基于传入数据的动态导航堆栈?
问题描述
因此,作为用户,当我第一次登录时,我会被带到 HomeScreen。在这个屏幕上,有这些提示值从我们的 API 返回并输入到 Redux。这些值决定了我是否要在主屏幕上显示这些屏幕。
我创建了一个函数来根据虚拟数据动态创建堆栈。它对我来说工作正常,但是当我尝试使用实际数据时我意识到了一个问题。我需要将这些 redux 值传递给我的 prompt-stack.js (这是一个非反应组件,所以我不能在这里使用 useSelector ......据我所知?)
下面是我在主屏幕上的代码示例,是什么导致导航显示此堆栈、创建堆栈的函数以及虚拟数据。
import React, { useEffect } from 'react';
import { useSelector } from 'react-redux';
const Home = ({ navigation }) => {
const { show_prompt1, show_prompt2, show_prompt3 } = useSelector(
state => state.reducer,
);
useEffect(() => {
if (show_prompt1 || show_prompt2 || show_prompt3) {
navigation.navigate('PromptStack');
}
}, [show_prompt1, show_prompt2, show_prompt3]);
return <View />;
};
// PROMPT STACK
import { Prompt1, Prompt2, Prompt3} from './screen-prompts'
import { createStackNavigator } from 'react-navigation-stack';
const dummyData = {
show_prompt1: true,
show_prompt2: true,
show_prompt3: false,
};
const promptConfigs = [
{
id: 0,
screenKey: 'Prompt1',
screenName: Prompt1,
valueToMatch: 'show_prompt1',
},
{
id: 1,
screenKey: 'Prompt2',
screenName: Prompt2,
valueToMatch: 'show_prompt2',
},
{
id: 2,
screenKey: 'Prompt3',
screenName: Prompt3,
valueToMatch: 'show_prompt3',
},
];
const createRoutes = () => {
let RouteConfigsObject = {};
promptConfigs.forEach(item => {
if (dummyData[item.valueToMatch]) {
RouteConfigsObject = {
...RouteConfigsObject,
[item.screenKey]: {
screen: item.screenName,
},
};
}
});
return RouteConfigsObject;
};
const RouteConfigs = createRoutes();
const initialRouteName = Object.keys(RouteConfigs)[0];
const NavigatorConfig = { initialRouteName };
const PromptStack = createStackNavigator(RouteConfigs, NavigatorConfig);
导出默认 PromptStack;在这种情况下,我将如何用 redux 数据替换虚拟数据,或者我还能做些什么来解决这个问题?谢谢!
我正在使用 React Navigation v4 顺便说一句
解决方案
这在 React Navigation 4 中是不可能的,但在 React Navigation 4 中使用
import { NavigationContainer } from '@react-navigation/native'
这就是我正在做的事情:
const screenData = [
{screen: 'Prompt1', value: show_prompt1},
{screen: 'Prompt2', value: show_prompt2},
{screen: 'Prompt3', value: show_prompt3},
]
在我的 useEffect 中,我运行了一个 forEach 来检查哪些值是真的并将它们推入一个数组中。数组保存在我的状态。完成后,我使用另一个 useEffect 导航到下一个屏幕:
useEffect(() => {
if(screensStateData.length > 0){
navigation.navigate(screenStateData[0], {screenStateData:
screenStateData.slice(1)})
}
},[navigation])
我的实际代码还有一些条件,但我只是在创建一个示例。因此,当我在下一个屏幕上时,我可以获取参数,做我需要做的事情,然后再次导航到,navigation.navigate(screenStateData[0])
因为我已经从数组中删除了第一个屏幕。
我还有一些事情要做,但到目前为止它还在工作!
推荐阅读
- android - 无法解决:multidex-instrumentation
- git - 重复提交可能是因为来自多个来源的变基
- javascript - SAPUI5 向现有表添加新列和值
- content-security-policy - 如何在 Tomcat 9 上的 404 上设置安全标头?
- go - 当我从 tcp 缓冲区读取时,我应该为 mtu 值选择哪个数字
- javascript - Javascript正则表达式特殊字符不起作用
- ruby-on-rails - ActiveStorage 订单
- c++ - Move a Character in a 2d Array
- python - 烧瓶 StreamConsumingMiddleware 不再工作
- c# - 以编程方式禁用 Windows 通知?