欧阳静宜 發表於 2020-5-26 19:44:00

Angular 中自定义模块

<p><img src="https://img2020.cnblogs.com/blog/1447456/202005/1447456-20200526185647460-863241757.png" alt=""></p>
<h3>一、Angular&nbsp; &nbsp;内置模块</h3>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/1447456/202005/1447456-20200526185748964-1359628264.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>&nbsp;二、Angular 自定义模块</h3>
<p>当我们项目比较小的时候可以不用自定义模块。但是当我们项目非常庞大的时候把所有的组</p>
<p><br>件都挂载到根模块里面不是特别合适。</p>
<p>&nbsp;</p>
<p>所以这个时候我们就可以自定义模块来组织我们的项目。并且通过 Angular 自定义模块可以实现路由的懒加载。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>例如,创建商品模块:</p>
<p>ng g module module/product:</p>
<p>product.module.ts</p>
<p>创建模块的根组件:product组件</p>
<p>ng g component module/product</p>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202005/1447456-20200526193043927-505909500.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;创建其他组件:</p>
<p>ng g component module/product/components/plist</p>
<p>ng g component module/product/components/cart</p>
<p>ng g component module/product/components/pinfo</p>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202005/1447456-20200526193545597-30645263.png" alt=""></p>
<p>&nbsp;</p>
<p><span style="font-size: 16px"><strong>在product.t里面操作:</strong></span></p>
<p>&nbsp;把product.ts的根组件暴露出去</p>
<p>exports://暴露组件,让其他模块里面可以使用暴露的组件</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202005/1447456-20200526193955070-1386714771.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;在根模块app.module.ts挂载根模块</p>
<p><strong>在app.module.ts里面引用自定义模块</strong></p>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202005/1447456-20200526194212532-751125760.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;之后可以在根组件.html调用商品模块</p>
<h3>自定义模块以及配置路由模块懒加载</h3>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601094633711-511342195.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;配置模块里面的路由:</p>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601094808064-1949306273.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>ng g module module/product:</p>
<p>产生:product.module.ts</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601095058234-1766475253.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>ng g module module/product --routing</p>
<p><span style="background-color: rgba(255, 255, 0, 1)"><strong><span style="font-size: 16px">该命令是:创建模块的同时,创建路由</span></strong></span></p>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601095114430-472745879.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>创建模块的根组件:product组件</p>
<p>ng g component module/product</p>
<p>&nbsp;</p>
<h3>如何实现模块的懒加载</h3>
<p>懒加载提升应用性能</p>
<p>cd 到指定项目下</p>
<p>新建:ng new angularlayload&nbsp;</p>
<p>cd 到项目名下:</p>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601112330168-1742917636.png" alt=""></p>
<p>&nbsp;</p>
<p>安装依赖:npm install</p>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601113254267-1264013406.png" alt=""></p>
<p>运行项目:ng serve</p>
<h3>新建模块:</h3>
<p>如下代码在创建模块时一起创建路由</p>
<p>ng g module module/user --routing</p>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601113845538-725208834.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601113908595-1842976590.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>ng g module module/article --routing</p>
<p>ng g module module/product --routing</p>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601114129005-438575490.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;然后分别创建:article/product/user的组件</p>
<p>ng g component module/user</p>
<p>ng g component module/article</p>
<p>ng g component module/product</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601115502577-1560085244.png" alt=""></p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601141131650-1416527331.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>以user模块为例:</p>
<p>在user-routing里面 引入user.module.ts</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span> { UserComponent } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./user.component</span><span style="color: rgba(128, 0, 0, 1)">'</span>;</pre>
</div>
<p>配置路由:</p>
<div class="cnblogs_code">
<pre>const routes: Routes =<span style="color: rgba(0, 0, 0, 1)"> [

{path:</span><span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">,component:UserComponent}

];</span></pre>
</div>
<p>&nbsp;</p>
<p>同理配置product和article</p>
<p>&nbsp;</p>
<p>在根app.component.html挂载模块</p>
<div class="cnblogs_code">
<pre>&lt;header&gt;
&lt;a =<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">['/user']</span><span style="color: rgba(128, 0, 0, 1)">"</span> &gt;用户模块&lt;/a&gt;
&lt;a =<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">['/product']</span><span style="color: rgba(128, 0, 0, 1)">"</span> &gt;商品模块&lt;/a&gt;
&lt;a =<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">['/article']</span><span style="color: rgba(128, 0, 0, 1)">"</span> &gt;商品详情&lt;/a&gt;

&lt;/header&gt;</pre>
</div>
<p>显示:</p>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601145126745-665688103.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;需要动态加载,所以要:</p>
<h3>在app-routing.module.ts-懒加载</h3>
<div class="cnblogs_code">
<pre>const routes: Routes =<span style="color: rgba(0, 0, 0, 1)"> [

{
</span>// path: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user</span><span style="color: rgba(128, 0, 0, 1)">'</span>,loadChildren:<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./module/user/user.module#UserModule</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
path:</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
loadChildren: () </span>=&gt; <span style="color: rgba(0, 0, 255, 1)">import</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./module/user/user.module</span><span style="color: rgba(128, 0, 0, 1)">'</span>).then(mod =&gt;<span style="color: rgba(0, 0, 0, 1)"> mod.UserModule)

},

{
path:</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">article</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
loadChildren: () </span>=&gt; <span style="color: rgba(0, 0, 255, 1)">import</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./module/article/article.module</span><span style="color: rgba(128, 0, 0, 1)">'</span>).then(mod =&gt;<span style="color: rgba(0, 0, 0, 1)"> mod.ArticleModule)
</span>// loadChildren: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./module/article/article.module#ArticleModule</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
},

{
    </span>// path: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">product</span><span style="color: rgba(128, 0, 0, 1)">'</span>,loadChildren:<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./module/product/product.module#ProductModule</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">

    path:</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">product</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
    loadChildren: () </span>=&gt; <span style="color: rgba(0, 0, 255, 1)">import</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./module/product/product.module</span><span style="color: rgba(128, 0, 0, 1)">'</span>).then(mod =&gt;<span style="color: rgba(0, 0, 0, 1)"> mod.ProductModule)

},

    {
      path: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">**</span><span style="color: rgba(128, 0, 0, 1)">'</span>,redirectTo:<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    }

];</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;在user新建组件:</p>
<p>ng g component module/user/components/profile</p>
<p>ng g component module/user/components/address</p>
<p>在user.module.ts中复制</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span> { ProfileComponent } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./components/profile/profile.component</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">import</span> { AddressComponent } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./components/address/address.component</span><span style="color: rgba(128, 0, 0, 1)">'</span>;</pre>
</div>
<p>到user-routing.module.ts中</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">//引入模块<br>import</span> { ProfileComponent } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./components/profile/profile.component</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">import</span> { AddressComponent } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./components/address/address.component</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;


//引入路由
const routes: Routes </span>=<span style="color: rgba(0, 0, 0, 1)"> [

{path:</span><span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">,component:UserComponent},

{path:</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">profile</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,component:ProfileComponent},
{path:</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">address</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,component:AddressComponent},



];</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601171802159-278691734.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;自定义模块里面配置路由</p>
<p>&nbsp;创建其他组件:</p>
<p>ng g component module/product/components/plist</p>
<p>ng g component module/product/components/cart</p>
<p>ng g component module/product/components/pinfo</p>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601172122646-906560146.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>为product配置路由:</p>
<p>在product-routing.module.ts引入product.module.ts中生成的组件模块:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span> { PlistComponent } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./components/plist/plist.component</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">import</span> { CartComponent } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./components/cart/cart.component</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">import</span> { PinfoComponent } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./components/pinfo/pinfo.component</span><span style="color: rgba(128, 0, 0, 1)">'</span>;</pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601172526099-1837346020.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601172633057-923063271.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>父子路由定义区别</h3>
<div class="cnblogs_code"><img id="code_img_closed_bc7e584f-11d6-4d10-a88a-7333b90e1d83" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_bc7e584f-11d6-4d10-a88a-7333b90e1d83" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_bc7e584f-11d6-4d10-a88a-7333b90e1d83" class="cnblogs_code_hide">
<pre>const routes: Routes =<span style="color: rgba(0, 0, 0, 1)"> [
{path:</span><span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">,component:ProductComponent,

children:[
{path:</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">cart</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,component: CartComponent},
{path:</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">pinfo</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,component:PinfoComponent},
]
},

{path:</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">plist</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,component:PlistComponent},

];</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601173435571-818842820.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;定义cart和pinfo为product的子路由</p>
<p>&nbsp;</p>
<p>访问cart不会出现cart页面,依旧是product页面</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601173606582-2049739319.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;如果要显示子路由的页面</p>
<p>需要在父路由product.html配置</p>
<div class="cnblogs_code">
<pre>&lt;router-outlet&gt;&lt;/router-outlet&gt;<br><br>这样访问就可以显示</pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1447456/202006/1447456-20200601173947945-520851015.png" alt=""></p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    悟已往之不谏,知来者之可追。<br><br>
来源:https://www.cnblogs.com/foremostxl/p/12968256.html
頁: [1]
查看完整版本: Angular 中自定义模块