【发布时间】:2020-06-03 18:19:21
【问题描述】:
我有应用程序“音乐应用程序”供两个用户输入“访客,已注册用户”
我有一个底部导航器, 当访客打开我的应用程序时,我只想呈现 4 个底部选项卡“主页、浏览、搜索、广播”。
但是当用户登录/注册时,我想呈现 5 个标签,之前的标签加上“库”标签。
所以
我在用户 register\login 时调度操作,并将 isLogin 状态从 false 更改为 true 并执行一些操作,例如添加一些其他数据到我的抽屉里,看起来还不错,
我想访问 react-navigation 文件“Tabs.js”中的redux store,
我想从mapStateToProps 访问状态,但我无法从非类组件访问this.props.isLogin!
所以我不知道如果我不使用 Class 组件怎么办!
那么有没有办法在 Tabs.js 文件中使用“连接 HOC”来访问 redux 存储?
代码
Tabs.js 文件
import {connect} from 'react-redux';
import {store} from '../redux/store/store';
const LoginTabs = createBottomTabNavigator({....}); // For user '5 tabs'
const notLoginTabs = createBottomTabNavigator({....}); // For Guest '4 tabs'
const App = this.props.isLogin ? LoginTabs : notLoginTabs; // Not work i know :P
export default (createAppContainer(App));
为 Drew Reese 编辑答案
当我尝试以这种方式进行操作时,我收到了错误消息
const mapStateToProps = state => {
console.log('state', state);
return {
isLogin: state.user.isLogin,
};
};
const App = ({isLogin, ...props}) =>
isLogin ? <LoginTabs {...props} /> : <NotLoginTabs {...props} />;
const Root = createAppContainer(App);
export default connect(mapStateToProps)(Root);
错误信息
这个导航器有导航和容器属性,所以它是 不清楚它是否应该拥有自己的状态。移除道具:“isLogin, dispatch" 如果导航器应该从导航中获取其状态 支柱。如果导航器应该保持自己的状态,不要通过 导航道具。
我尝试了什么
我把所有的堆栈都放了
“抽屉、堆栈、底部标签”
在一个文件“类组件”中,它可以工作,但正如@Drew 所说,这样做不是一个好主意:)
这里有一个gist 文件,如果你想看的话
【问题讨论】:
-
这看起来一点也不正确 - 在您访问“this.props”时的倒数第二行中,您不在组件内,因此“this.props”不应该存在。
-
@Izkata 我知道,所以我的问题是如何访问此文件中的
this.props:) -
这个新警告我们的错误源自什么/在哪里?
-
如果不是尝试在您定义导航器的地方连接您的 redux 存储,以便您可以选择性地呈现一个或另一个选项卡,而是将该逻辑移动到一个“选项卡”组件,该怎么办?连接到你的 redux 商店?这将取消混合
connectHOC 注入的isLogin和dispatch道具。如果这对您有用,我可以更新我的答案。它甚至可以进一步减少,因为您的两个“选项卡”对象之间存在大量代码重复。 -
@DrewReese 我们正在等待:3
标签: javascript reactjs react-native redux react-navigation