我正在构建一个与reactJS中的某些API进行对话的Web应用程序。
我的应用有4个角色,管理员,主人,奴隶,宝贝。
每个角色都可以看到比其他角色更多的东西,因此菜单和视图在它们之间略有不同。
e.g。
The navbar has:
for the admin: 5 buttons
for the master: 4 buttons
for the salve: 3 buttons
for the baby: 2 buttons
我想知道构建此应用程序的最佳做法是什么:
我应该有4个不同的应用吗?这样组件就很清楚,但每次我需要实现一个新功能时,我都要修改4个应用程序。
如果这是唯一的方法,如何在登录后根据角色调用正确的应用程序?
答案 0 :(得分:0)
拥有四个具有大量重叠代码/功能的独立应用肯定不是最好的方法;这将导致大量不必要的重复。
如果不同的角色只是添加/删除小的特性和功能,我只会将这些元素的渲染包装在条件中。例如:
renderAdminButton: function() {
( if this.props.user.role === 'admin' ) {
return (
<button />
);
}
}
然后在父app / component render
函数内调用此函数。
但是,如果您真的希望为每个角色分别创建一个应用程序,则可以使用与此类似的函数有条件地呈现应用程序:
renderApp: function() {
var apps = {
admin: AdminApp,
master: MasterApp,
slave: SlaveApp,
baby: BabyApp
};
return apps[this.props.user.role];
}
答案 1 :(得分:0)
在你的按钮组件中检查this.props.hide并返回null。
render() {
if (this.props.hide) {return null;}
return (
<button>
{this.props.btn.text}
</button>
);
}
在您的父组件中包含每个按钮的逻辑隐藏道具。
render() {
var hideAdminBtn = this.props.appState.userRole != 'admin';
return (
<JButton hide={hideAdminBtn} />
);
}
答案 2 :(得分:0)
您要做的是将每种访问类型设置为 prop ,以便您可以根据收到的道具类型呈现应用程序,最好是componentDidMount()
。然后,您可以拥有一个MasterView
来接收道具并相应地决定要渲染的视图。代码将如下所示:
var MasterView = React.createClass({
var roleType = this.props.role;
render: function() {
if(roleType === 'admin') {
return (
<AdminView />
);
}
});
至于您对实现新功能的关注,您应该将视图和逻辑分解为简单且可重用的组件。例如,您的所有访问类型都可以共享公共<Header />
和<Footer />
组件以及<Profile />
<Settings />
等。请注意,这些可以进一步细分,以便在您制作时它将传播到您的所有视图的任何组件的小变化。类似的原则也适用于您的逻辑。请记住保持 DRY 。
修改强>
我们假设该应用是为商店制作的。通过此门户显示的所有数据(由组件名称起)均为:
<EmployeeProfile />
<EmployeeSalary />
<BuyerRecords />
<BalanceSheet />
<Inventory />
<Billing />
现在让我们定义每个角色的访问级别:
现在,将定义这6个广泛的组件,并且肯定包含多个组件。只要确保每当您认为视图的特定部分将在其他地方使用时,请继续将其转换为单独的组件。
最后,角色应该像这样呈现:
var AdminView = React.createClass({
render: function() {
return (
<div>
<EmployeeProfile />
<EmployeeSalary />
<BuyerRecords />
<BalanceSheet />
<Inventory />
<Billing />
</div>
);
}
});
var MasterView = React.createClass({
render: function() {
return (
<div>
<EmployeeProfile />
<BuyerRecords />
<BalanceSheet />
<Inventory />
<Billing />
</div>
);
}
});
var SlaveView = React.createClass({
render: function() {
return (
<div>
<BuyerRecords />
<BalanceSheet />
<Billing />
</div>
);
}
});
var ChildView = React.createClass({
render: function() {
return (
<div>
<Inventory />
<Billing />
</div>
);
}
});
这样您就有4个父组件处理所有视图。它们由多个组件组成,如果需要进行更改,则只需执行一次,它将反映所有角色。
如果您决定对每个角色稍加修改<Inventory />
,则可以选择根据角色呈现<Inventory />
的不同子组件。
继续看看这个官方blog post。应该有助于消除任何疑虑:)