Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs React SPA与React router/React router dom的多文档选项卡式界面的代码设计?_Reactjs_User Interface_Redux_React Router_Tabs - Fatal编程技术网

Reactjs React SPA与React router/React router dom的多文档选项卡式界面的代码设计?

Reactjs React SPA与React router/React router dom的多文档选项卡式界面的代码设计?,reactjs,user-interface,redux,react-router,tabs,Reactjs,User Interface,Redux,React Router,Tabs,我有React-SPA应用程序和React-router/React-router dom导航,这意味着有React-router dom(React-router的附加层)交换机语句,根据路径选择: <Switch> <Route path='/login' component={LoginPage}/> <Route path='/about' component={AboutPage}/> <Route exact path

我有React-SPA应用程序和React-router/React-router dom导航,这意味着有React-router dom(React-router的附加层)交换机语句,根据路径选择:

<Switch>
    <Route path='/login' component={LoginPage}/>
    <Route path='/about' component={AboutPage}/>
    <Route exact path='/' component={HomePage}/>
    <Route path='/sales/orderlist' component={OrderListPage}/>
    <Route path='/sales/order' component={() => <OrderPage/>}/>
    <Route path='/sales/order/:id' component={() => <OrderPage/>}/>
    <Route path='/sales/invoicelist' component={InvoiceListPage}/>
    <Route path='/sales/invoice' component={InvoicePage}/>
    <Route path='/sales/invoice/:id' component={InvoicePage}/>
</Switch>

}/>
}/>
我的应用程序在导航栏中也有react路由器链接,所以-这就是简单导航的工作方式。我知道执行“/sales/invoice/58”链接会做以下三件事:

  • 它实例化InvoicePage组件
  • 它将id值58移动到InvoicePage的道具
  • 它使实例化的组件(实际上是具有大内容的元素)可见,而所有剩余的实例化组件(如果有,例如InvoiceListPage)(它们只是具有大内容的元素/DOM树)可见=false。我不确定这种向外导航是否会释放组件,我的猜测是,它们会留在内存中(在DOM树中)。我也不确定当连续两次调用“sales/invoice/59”和“sales/invoice/60”时会发生什么情况-是否只实例化了一个InvoicePage组件,然后将其props属性从59更改为60(根据该组件中编码的业务逻辑,这可能会或可能不会触发完全或部分数据重新加载)?或者,react路由器可以确保两个具有两个不同id值的不同调用创建两个不同的组件?(这些小问题不是应该回答的SO问题意义上的问题-我只是在这里胡言乱语,我以问题的形式列出了要考虑的要点,这些不是真正的SO问题)
  • 我的问题是-如何将此设计转化为多选项卡多文档设计?我的应用程序应该位于浏览器的一个页面/选项卡中,并且我的应用程序应该具有应用程序级选项卡。例如,当用户按下到InvoiceList的链接时,将打开带有InvoiceList报告的新应用程序选项卡。当用户选择一个确定发票和此报告并单击链接时,将打开另一个带有发票(具有特定Id)的应用程序选项卡。用户可以打开多个具有不同发票的选项卡

    这种多选项卡多文档界面的设计思想是什么?创建一个应该是相当困难和混乱的。例如,标准react router在浏览器url字段中显示指向活动组件的#-链接。但是,如果我的SPA应用程序有多个打开/活动的应用程序级选项卡,其中包含多个打开的组件/文档,那么浏览器应该显示什么链接

    Redux支持呢?通常应用程序有一个应用程序范围的Redux存储,但现在每个组件(InvoiceListPage、InvoicePage、OrderPage)应该有自己的Redux存储-即Redux存储应该作为数组实现,整个SPA应用程序应该保留一些记录-哪个组件属于Redux数组的哪个元素

    只是想了解react路由器用于react SPA web应用程序的多选项卡多文档界面的总体设计


    这种多选项卡GUI非常常见-例如Metasfresh有一个,Lotus Notes有一个,多选项卡界面是Microsoft WPF多文档界面的首选组织(至少在我不久前读到它时是这样)。

    在reactJS中,您有本地状态(this.state或useState)从父组件(称为props)传递状态,从祖先组件(称为context)传递状态,从应用程序的其他部分(例如redux)传递状态。但所有这些都只是“状态”,根据它你可以在屏幕上呈现你想看到的东西

    那么什么是MDI有效?它是一个打开文档的列表(因此您需要在您的状态中的某个位置有一个打开文档的列表,其中的每个元素都应该表示该特定文档的当前状态),以及一个当前打开的文档,它应该位于您的状态中的某个位置。在您的示例中,告诉您哪一个是当前打开的文档的状态是。。。反应路由器的位置

    因此,您可以使用redux(或创建自己的存储)并将打开的文档保存在某处

    //存储的实例
    {
    ...,
    openDocuments:[
    {路径:'/sales/invoice/1',标题:'invoice#1',…},
    {路径:'/sales/invoice/2',标题:'发票#2',…},
    {路径:'/sales/order/13',标题:'order#13',…}
    ],
    ...
    }
    //每个openDocument的“path”属性用作该文档的id
    //并且在数组中应该是唯一的
    
    然后在布局中,您应该有一个选项卡式导航栏,将每个项目呈现为选项卡,并可能高亮显示活动选项卡(通过使用useMatch钩子检查页面位置是否与该特定项目的id匹配)

    在布局的中间,您应该有一个常规的
    ,它将根据react路由器的位置呈现实际页面。 您还可以创建一些钩子,如
    useCurrentDocumentState
    ,以读取当前打开的文档的状态。(例如,在该钩子中,您可以从商店中读取,在数组中找到与实际打开的文档相对应的项目并返回它)

    实际上,如果你想一想,通常的单页应用程序,左边有导航栏(菜单项),它只是一种多文档界面,所有菜单项都被认为是“打开”的,但只有当你点击它们时才聚焦

    实际上,您不应该关心DOM中发生了什么,也不应该关心您的选项卡是否保持打开状态,而是隐藏或从DOM中删除。处理DOM是react的职责,事实上这也是它构建的原因之一。这样你就不用担心DOM了。您应该只关心在应用程序的生命周期中,希望为每个选项卡(选项卡的状态)保持打开状态的信息是什么