xml地图|网站地图|网站标签 [设为首页] [加入收藏]

angular和vue的路由切换,Components构建单页面应用

来源:http://www.ccidsi.com 作者:呼叫中心培训课程 人气:120 发布时间:2019-05-02
摘要:至于我:周进林 茫茫大海中的一枚技师,为了发展为二个男神人类而全心全意着。关切java、python、linux、vim等(新浪今日头条:@酒肉和尚--进林) 个人主页 · 笔者的篇章 · 20 ·   

至于我:周进林

图片 1

茫茫大海中的一枚技师,为了发展为二个男神人类而全心全意着。关切java、python、linux、vim等(新浪今日头条:@酒肉和尚--进林) 个人主页 · 笔者的篇章 · 20 ·  

图片 2

 

1、angular.min.js,angular.route.min.js

壹.壹、引用插件

1.2、<ng-view></ng-view>

1.3、<li><a href="#/">首页</li>

壹.4、用.when和.otherwise配置内部的路由规则

用Web Components构建单页面应用

2015/01/19 · JavaScript · Web Components

本文由 伯乐在线 - 周进林 翻译,Mxt 校稿。未经许可,禁止转发!
英文出处:www.polymer-project.org。迎接参加翻译组。

您是怎么样选取Polymer创设1个单页应用的?那几个标题大家在Polymer共青团和少先队里早已问过无数遍了。大家的答案(一如在此以前地)是“使用组件(component)!”。不过,使用新本领去化解现存的标题反复不会即时获得鲜明的功效。怎样把一批模块化组件组合到二个特大型的实用的施用中去?

在本教程,小编将会给你显得怎么着去营造贰个效益1体化的单页应用:

图片 3

  • 一心采纳Polymer的着力要素构建
  • 动用响应式设计
  • 使用数据绑定性情过渡视图
  • 利用U帕杰罗L路由和深层链接天性
  • 可访问键盘
  • 按需动态载入内容(可选)

 张开演示

 

angular和vue是多个不一致的框架,不过所用和所布署的覆辙差不离1致

一、引进你所要的js

贰、路由展现

叁、切换路由中间的剧情

4、路由就js配置

结束语

今日,你应该掌握使用Polymer和web组件创设的单页应用的着力构架了。那恐怕和营造守旧的应用有所差异,但看来,组件让职业变得轻便多了。当你重用(宗旨)组件和采取Polymer的数目绑定个性时,你能够写更加少的CSS/JS。能够写越来越少的代码的感觉真好!

赞 收藏 评论

【1】路由代码 main.js App.vue index.hbs webpack.config.js
main.js

2、angular.min.js,angular-ui-router.js

贰.壹、引用插件

2.2、<ui-view></ui-view>

2.3、<li><a href="index">首页</li>

贰.四、用state和.otherwise配置内部的路由规则

键盘导航

键盘援救的第3不仅仅是为着便于的访问,它一样会使SPA用户刚到更和颜悦色。

<core-a1一y-keys>是三个标准浏览器键盘事件的放置组件。它可以在你的使用里增加键盘支持。这里有多少个例证:

XHTML

<core-a11y-keys target="{{parentElement}}" keys="up down left right space space shift" on-keys-pressed="{{keyHandler}}"></core-a11y-keys>

1
2
3
<core-a11y-keys target="{{parentElement}}"
keys="up down left right space space shift"
on-keys-pressed="{{keyHandler}}"></core-a11y-keys>

mutation 是同步函数 能够达成action的职能, 
action提交的是 mutation,能够异步操作 
mutation直接变状态

3、vue.min.js,vue-router.min.js

3.一、引用插件

3.2、<router-view></router-view>

三.三、在页面中务必写三个重视成分

<div id="app"></div>

3.4、<li><router-link to="/home">首页</></li>

三.伍、配置组件<template></template>,当配置组件的时候,里面是必须求有二个根元素

<template id="home">

<div><h1>首页页面</h一></div>

</template>

3.陆、配置js,先获得到零部件

var home=Vue.extend({

template:"#home"

})

3.7、配置js路由

var router=new VueRouter({

  routes:[

      {path:"/home",component:home},

      {path:"/",redirect:"/home"}

]

})

3.8、实例化vue

var vue=new Vue({

el:"#app",//获取到页面的重视成分

router:router//获取到您布置好的路由

})

润饰和得了

此处有部分小本领和诀窍你可以用来改良您的选用。

当二个美食指南条款被挑选后,关闭应用的抽屉菜单(drawer):

JavaScript

<core-menu ... on-core-select="{{menuItemSelected}}">

1
<core-menu ... on-core-select="{{menuItemSelected}}">

JavaScript

template.menuItemSelected = function(e, detail, sender) { if (detail.isSelected) { scaffold.closeDrawer(); } };

1
2
3
4
5
template.menuItemSelected = function(e, detail, sender) {
  if (detail.isSelected) {
    scaffold.closeDrawer();
  }
};

为导航选取条约设置不一致的Logo:

XHTML

<paper-item noink> <ore-icon icon="label{{route != page.hash ? '-outline' : ''}}"></core-icon> <core-animated-pages ... on-tap="{{cyclePages}}">

1
2
3
<paper-item noink>
  &lt;ore-icon icon="label{{route != page.hash ? '-outline' : ''}}">&lt;/core-icon>
<core-animated-pages ... on-tap="{{cyclePages}}">

JavaScript

template.cyclePages = function(e, detail, sender) { // If click was on a link, navigate and don't cycle page. if (e.path[0].localName == 'a') { return; } e.shiftKey ? sender.selectPrevious(true) : sender.selectNext(true); };

1
2
3
4
5
6
7
8
template.cyclePages = function(e, detail, sender) {
  // If click was on a link, navigate and don't cycle page.
  if (e.path[0].localName == 'a') {
    return;
  }
  e.shiftKey ? sender.selectPrevious(true) :
               sender.selectNext(true);
};

<tab page="home"></tab>
<a href="xx" :class="{active:page=='home'}"
<i class='icon' :class="page=='home'?'tab-active':'tab'></i>
</a>
props:['page']

U揽胜极光L路由(U汉兰达L routing)和深层链接

<flatiron-director>是三个封装了flatiron director JS library(一个JS库)的web组件。更动它的route属性把U奥德赛L#号(U奥迪Q7L hash)更新到平等的值。

当大家想在页面加载时保持上次的视图时,数据绑定再度派上用场。把路由(director.js里的director)、菜单和页面成分连接起来并使它们一同。当多个立异时,其余的同1跟着更新。

XHTML

<flatiron-director route="{{route}}" autoHash> ... <core-menu selected="{{route}}"> ... <core-animated-pages selected="{{route}}">

1
2
3
4
5
<flatiron-director route="{{route}}" autoHash>
...
<core-menu selected="{{route}}">
...
<core-animated-pages selected="{{route}}">

深层链接-当模板计划好时,初叶化路由。

XHTML

template.addEventListener('template-bound', function(e) { // Use URL hash for initial route. Otherwise, use the first page. this.route = this.route || DEFAULT_ROUTE; };

1
2
3
4
template.addEventListener('template-bound', function(e) {
// Use URL hash for initial route. Otherwise, use the first page.
this.route = this.route || DEFAULT_ROUTE;
};

<img v-if="item.img" @error="item=false">
<img v-if="!item.img" class="img-error">

应用架构

设计布局是从头三个门类的首要职分之壹。作为主导成分集合的1局地,Polymer通过多少个布局成分 来支撑应用程序的构架(<core-header-panel>, <core-drawer-panel>, <core-toolbar>)。那么些零件本人就很好用,可是为了更加快地起头项目,大家打算器重于<core-scaffold>。有了它你能够透过创设多少个基本的因素就能够做出贰个响应式的移动端布局。

<core-scaffold>的子成分能够是点名特定的要素或选用一定的竹签(或2者联手行使)。比如,使用<nav>成分成立应用抽屉菜单。你能够在放肆的要素里选用navigation属性(e.g <core-header-panel navigation>)。工具栏通过工具属性标记。它的具备其余子成分都定义在入眼内容区域里。

先看等级次序协会解析
build中 webpack.base.conf.js 引入 vue-loader.conf.js

例子

XHTML

<body unresolved fullbleed> <core-scaffold id="scaffold"> <nav>Left drawer</nav> <core-toolbar tool>Application</core-toolbar> <div>Main content</div> </core-scaffold> </body>

1
2
3
4
5
6
7
<body unresolved fullbleed>
  <core-scaffold id="scaffold">
    <nav>Left drawer</nav>
    <core-toolbar tool>Application</core-toolbar>
    <div>Main content</div>
  </core-scaffold>
</body>

让大家一并来深刻这么些内容的每1局部

 

创建“视图”

多视图(或然多页面)可以选择<core-pages>也许<core-animated-pages>来创造。在二回只呈现二个子成分时,四个因素都很有用。而选择<core-animated-pages>的益处是,它提供了越多的暗中同意和灵活的页面过渡。

上面包车型的士演示(demo)使用了<core-animated-pages>成分的slide-from-right过渡效果。首先,导入成分定义和slide-from-right过渡效果。

XHTML

<link rel="import" href="components/core-animated-pages/core-animated-pages.html"> <link rel="import" href="components/core-animated-pages/transitions/slide-from-right.html">

1
2
<link rel="import" href="components/core-animated-pages/core-animated-pages.html">
<link rel="import" href="components/core-animated-pages/transitions/slide-from-right.html">

下一场插入你的剧情:

XHTML

<div layout horizontal center-center fit> <core-animated-pages selected="0" transitions="slide-from-right"> <section layout vertical center-center> <div>Single</div> </section> <section layout vertical center-center> <div>page</div> </section> ... </core-animated-pages> </div>

1
2
3
4
5
6
7
8
9
10
11
<div layout horizontal center-center fit>
  <core-animated-pages  selected="0" transitions="slide-from-right">
    <section layout vertical center-center>
      <div>Single</div>
    </section>
    <section layout vertical center-center>
      <div>page</div>
    </section>
    ...
  </core-animated-pages>
</div>

在意,现在<core-animated-pagesselected=”0″>那行代码是硬编码去挑选第三页。但是大家以往会把它写成动态的。

前些天你应该具有了1个着力的应用,可是此地有局地小的难点亟待小心。多亏了Polymer各样成分提供的布局属性和默许样式,你能够不写任何的CSS代码就足以兑现多个响应式应用。当然,从material design调色板里得到一些灵感,设置不到10 CSS规则就能够让这几个相应变得越来越美观。

展示:没设置CSS     展示:设置CSS

vue2.4.4

按需加载内容

若是你想用户在你的运用里导航时动态加载内容要什么做?只需一些转移,大家就能够支撑动态加载页面。

率先,更新数据模型,使它蕴含内容的U奥迪Q5L:

JavaScript

template.pages = [ {name: 'Intro', hash: 'one', url: '/tutorial/intro.html'}, {name: 'Step 1', hash: 'two', url: '/tutorial/step-1.html'}, ... ];

1
2
3
4
5
template.pages = [
{name: 'Intro', hash: 'one', url: '/tutorial/intro.html'},
{name: 'Step 1', hash: 'two', url: '/tutorial/step-1.html'},
...
];

接下来改换菜单链接指向page.url而不是#:

XHTML

<paper-item hash="{{page.hash}}" noink> <a href="{{page.url}}">{{page.name}}</a> </paper-item>

1
2
3
<paper-item hash="{{page.hash}}" noink>
<a href="{{page.url}}">{{page.name}}</a>
</paper-item>

末段,使用我们的<core-ajax>好友来获得内容:

XHTML

<core-ajax id="ajax" auto url="{{selectedPage.page.url}}" handleAs="document" on-core-response="{{onResponse}}"> </core-ajax>

1
2
3
<core-ajax id="ajax" auto url="{{selectedPage.page.url}}"
handleAs="document" on-core-response="{{onResponse}}">
</core-ajax>

您可以把<core-ajax>看作是二个内容调节器。它的url属性数据绑定到selectedPage.page.url。那象征,无论什么样时候三个新的菜系条约被入选,XH大切诺基(XMLHttpRequest的缩写,译者注)就能去获得相应的页面。当core-response触发时,onResponse就能够把文书档案再次来到的1有些插入预先保留的器皿里。

JavaScript

template.onResponse = function(e, detail, sender) { var article = detail.response.querySelector('scroll-area article'); var pages = document.querySelector('#pages'); this.injectBoundHTML(article.innerHTML, pages.selectedItem.firstElementChild); };

1
2
3
4
5
6
7
template.onResponse = function(e, detail, sender) {
  var article = detail.response.querySelector('scroll-area article');
 
  var pages = document.querySelector('#pages');
  this.injectBoundHTML(article.innerHTML,
                       pages.selectedItem.firstElementChild);
};

AJAX实例演示

【二】vue-loader 从8.三.0(适合vue1.0)升级到十.三.0 页面报错 ,页面唯有1个根成分,不可能运用三个 :disabled , 不能动用首要字作为变量
【叁】样式在 style.less 中 @import "mintui.css"; 先把css聚集在三个文本
【4】vuex
核心 store (仓库) 包含 state (状态)
vue组件读取state,当state变化,组件会响应式更新
必变state的路径 【显式提交commit mutations 】

别的路由库

假诺您不爱好<flatiron-director>,能够尝试<app-router>或者<more-routing>。它们都以足以落成更复杂作用的路由(通配符,HTML5历史API,动态内容)。小编个人更爱好<flatiron-director>,因为它总结易用并且能够和<core-animated-pages>很好地包容使用

例子: <more-routing>

XHTML

<more-route-switch> <template when-route="user"> <header>User {{params.userId}}</header> <template if="{{ route('user-bio').active }}"> All the details about {{params.userId}}. </template> </template> <template when-route="/about"> It's a routing demo! <a _href="{{ urlFor('user-bio', {userId: 1}) }}">Read about user 1</a>. </template> <template else> The index. </template> </more-route-switch>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<more-route-switch>
  <template when-route="user">
    <header>User {{params.userId}}</header>
    <template if="{{ route('user-bio').active }}">
      All the details about {{params.userId}}.
    </template>
  </template>
  <template when-route="/about">
    It's a routing demo!
    <a _href="{{ urlFor('user-bio', {userId: 1}) }}">Read about user 1</a>.
  </template>
  <template else>
    The index.
  </template>
</more-route-switch>

例子: <app-router>

XHTML

<app-route path="/home" import="/pages/home-page.html"></app-route> <app-route path="/customer/*" import="/pages/customer-page.html"></app-route> <app-route path="/order/:id" import="/pages/order-page.html"></app-route> <app-route path="*" import="/pages/not-found-page.html"></app-route>

1
2
3
4
<app-route path="/home" import="/pages/home-page.html"></app-route>
<app-route path="/customer/*" import="/pages/customer-page.html"></app-route>
<app-route path="/order/:id" import="/pages/order-page.html"></app-route>
<app-route path="*" import="/pages/not-found-page.html"></app-route>

new Vue({
router,
render: h => h(App)
}).$mount('#app')

运用数据绑定

我们全体了一个施用,但那不值得壹提。那离DRY还远着。类似的标记在此处重现:

XHTML

<nav> <core-menu selected="0"> <paper-item noink> <core-icon icon="label-outline"></core-icon> <a href="#one">Single</a> </paper-item> <paper-item noink> <core-icon icon="label-outline"></core-icon> <a href="#two">page</a> </paper-item> <paper-item noink> <core-icon icon="label-outline"></core-icon> <a href="#three">app</a> </paper-item> ... </core-menu> </nav>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<nav>
  <core-menu selected="0">
    <paper-item noink>
      <core-icon icon="label-outline"></core-icon>
      <a href="#one">Single</a>
    </paper-item>
    <paper-item noink>
      <core-icon icon="label-outline"></core-icon>
      <a href="#two">page</a>
    </paper-item>
    <paper-item noink>
      <core-icon icon="label-outline"></core-icon>
      <a href="#three">app</a>
    </paper-item>
    ...
  </core-menu>
</nav>

那无差异不是动态的。当用户选拔三个美食指南条约时,页面不会更新。幸运的是,这一个难点都足以动用Polymer的数码绑定个性自在化解。

 -------------------------

注意

事件的target属性数据绑定到大家的全自动绑定模块的parentElement属性。在这一个案例里,它是<body>成分。

key属性包蕴叁个以空格分隔元素的列表,列表中包蕴了要监听键位。当那么些构成的中间八个被按下,<core-a1一y-keys>触发3个keys-pressed事件并调用你的回调函数。

keys-pressed事件的Computer使用<core-animated-pages>的selectNext/selectPrevious API去进入下1页大概重临上一页:

JavaScript

template.keyHandler = function(e, detail, sender) { var pages = document.querySelector('#pages'); switch (detail.key) { case 'left': case 'up': pages.selectPrevious(); break; case 'right': case 'down': pages.selectNext(); break; case 'space': detail.shift ? pages.selectPrevious() : pages.selectNext(); break; } };

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template.keyHandler = function(e, detail, sender) {
  var pages = document.querySelector('#pages');
 
  switch (detail.key) {
    case 'left':
    case 'up':
      pages.selectPrevious();
      break;
    case 'right':
    case 'down':
      pages.selectNext();
      break;
    case 'space':
      detail.shift ? pages.selectPrevious() : pages.selectNext();
      break;
  }
};

<img v-lazy="xx.img"/>
img[lazy=loading]{
background: url() no-repeat center center;
}
img[lazy=error]{
background:url()
}

抽屉菜单

你放在导航成分里的号子都定义在滑走的应用抽屉菜单里。为了咱们的对象 ,小编坚韧不拔运用标题(<core-toolbar>)和导航链接 (<core-menu>):

XHTML

<nav> <core-toolbar><span>Single Page Polymer</span></core-toolbar> <core-menu selected="0"> <paper-item noink> <core-icon icon="label-outline"></core-icon> <a href="#one">Single</a> </paper-item> <paper-item noink> <core-icon icon="label-outline"></core-icon> <a href="#two">page</a> </paper-item> ... </core-menu> </nav>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<nav>
  <core-toolbar><span>Single Page Polymer</span></core-toolbar>
  <core-menu selected="0">
    <paper-item noink>
      <core-icon icon="label-outline"></core-icon>
      <a href="#one">Single</a>
    </paper-item>
    <paper-item noink>
      <core-icon icon="label-outline"></core-icon>
      <a href="#two">page</a>
    </paper-item>
    ...
  </core-menu>
</nav>

只顾,今后<core-menu selected=”0″>被硬编码为挑选第二个条约。我们之后会把它改为动态的。

shasum check failed .. 重新安装 npm instal

行使数据模型( data model)简化标志

选择数据模型来发出标识能够大大方方缩减你写标志的数据。在大家的案例里,全体的美食指南条目款项和页面都得以行使1对<template repeat>元平昔表现。

XHTML

<core-menu valueattr="hash" selected="{{route}}"> <template repeat="{{page in pages}}"> <paper-item hash="{{page.hash}}" noink> <core-icon icon="label-outline"></core-icon> <a href="#{{page.hash}}">{{page.name}}</a> </paper-item> </template> </core-menu> <core-animated-pages valueattr="hash" selected="{{route}}" transitions="slide-from-right"> <template repeat="{{page in pages}}"> <section hash="{{page.hash}}" layout vertical center-center> <div>{{page.name}}</div> </section> </template> </core-animated-pages>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<core-menu valueattr="hash" selected="{{route}}">
  <template repeat="{{page in pages}}">
    <paper-item hash="{{page.hash}}" noink>
      <core-icon icon="label-outline"></core-icon>
      <a href="#{{page.hash}}">{{page.name}}</a>
    </paper-item>
  </template>
</core-menu>
 
<core-animated-pages valueattr="hash" selected="{{route}}"
                     transitions="slide-from-right">
  <template repeat="{{page in pages}}">
    <section hash="{{page.hash}}" layout vertical center-center>
      <div>{{page.name}}</div>
    </section>
  </template>
</core-animated-pages>

上边的暗记由下边包车型大巴数据模型来驱动:

XHTML

<script> var template = document.querySelector('template[is="auto-binding"]'); template.pages = [ {name: 'Single', hash: 'one'}, {name: 'page', hash: 'two'}, {name: 'app', hash: 'three'}, ... ]; </script>

1
2
3
4
5
6
7
8
9
<script>
  var template = document.querySelector('template[is="auto-binding"]');
  template.pages = [
    {name: 'Single', hash: 'one'},
    {name: 'page', hash: 'two'},
    {name: 'app', hash: 'three'},
    ...
  ];
</script>

瞩目,<core-animated-pages>和<core-menu>通过绑定它们的selected属性来涉及在联合。未来,当用户点击1个导航条款时,页面会做出相应的更新。valueattr=”hash”设置告诉七个要素在每一种条目款项里应用hash属性作为选取的值。

XHTML

<!-- data-bind the menu selection with the page selection --> <core-menu valueattr="hash" selected="{{route}}"> ... <core-animated-pages valueattr="hash" selected="{{route}}">

1
2
3
4
<!-- data-bind the menu selection with the page selection -->
<core-menu valueattr="hash" selected="{{route}}">
...
<core-animated-pages valueattr="hash" selected="{{route}}">

展示

iscroll.js 标准版
iscroll-lite.js 精简版 不匡助高效、滚动条、鼠标滚轮滚动
iscroll-probe.js 当前滚动地点
iscroll-zoom.js 缩放
iscroll-infinite.js Infiniti和缓存滚动

自行绑定模板(template)

为了采用<polymer-element>外的绑定数据,包装二个Yo应用?利用内部的全自动绑定<template>成分:

XHTML

<body unresolved fullbleed> <template is="auto-binding"> <core-scaffold id="scaffold"> ... </core-scaffold> </template> </body>

1
2
3
4
5
6
7
<body unresolved fullbleed>
  <template is="auto-binding">
    <core-scaffold id="scaffold">
      ...
    </core-scaffold>
  </template>
</body>

提示,<template>自动绑定成分允许大家在重中之重页面里使用{{}},表达式和on-*来声称事件管理器。

var path = require('path')
var jsonServer = require('json-server')
var server = jsonServer.create()
var userRouter = jsonServer.router(path.resolve(__dirname,'xx.json'))
var middlewares = jsonServer.defaults()

工具栏

工具栏横跨了页面顶部并含有了成效按键Logo。满足那种效益的公正无私元素是<core-toolbar>:

XHTML

<!-- flex makes the bar span across the top of the main content area --> <core-toolbar tool flex> <!-- flex spaces this element and jusifies the icons to the right-side --> <div flex>Application</div> <core-icon-button icon="refresh"></core-icon-button> <core-icon-button icon="add"></core-icon-button> </core-toolbar>

1
2
3
4
5
6
7
<!-- flex makes the bar span across the top of the main content area -->
<core-toolbar tool flex>
  <!-- flex spaces this element and jusifies the icons to the right-side -->
  <div flex>Application</div>
  <core-icon-button icon="refresh"></core-icon-button>
  <core-icon-button icon="add"></core-icon-button>
</core-toolbar>

import Vuex from 'Vuex'
Vue.use(Vuex)

根本内容

最终壹有个别是为您的内容而留的。它能够是别的的要素。<div>是四个很好的选取:

XHTML

<div layout horizontal center-center fit> <!-- fill with pages --> </div>

1
2
3
<div layout horizontal center-center fit>
  <!-- fill with pages -->
</div>

fit属性表示首要区域的始末会分布父成分的宽带和惊人,layout horizontal center-center属性表示使用弹性框(flexbox)来使内容居1月垂直居中。

routes.json
{
"/abc/company":"/company"
}

页面保存数据 
this.$store.commit(Mutation.INCREMENT, {val: 150}) // 跟最初的交由mutation同样
页面保存数据 action 
this.$store.dispatch('increment', 111) // action 通过 dispatch 触发

 

sourceTree 1.9.6.2

action 不援助传入对象

页面跳转 this.$router.push('/friendLoan')

{
path: '*',
redirect: {name: 'user'}
}
]


 

把 Vuex.Store独立成文件 
state,mutation 放到 modules/xx.js 
getters 独立出来
actions 独立出来 
把mutatioin的常量独立出来 mutation-types.js

本文由68399皇家赌场发布于呼叫中心培训课程,转载请注明出处:angular和vue的路由切换,Components构建单页面应用

关键词: 68399皇家赌场 JavaScript 我爱编程 编程

上一篇:皇家娱乐登录函数中的,轻松学习

下一篇:没有了

最火资讯