澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站:angular和vue的路由切换,

2019-06-16 作者:澳门新萄京赌场网址   |   浏览(116)

用Web Components构建单页面应用

2015/01/19 · JavaScript · Web Components

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

你是如何使用Polymer构建一个单页应用的?这个问题我们在Polymer团队里已经问过很多遍了。我们的答案(一如既往地)是“使用组件(component)!”。然而,使用新技术去解决现有的问题往往不会马上得到显著的效果。如何把一堆模块化组件组合到一个大型的实用的应用中去?

在本教程,我将会给你展示如何去构建一个功能完整的单页应用:

澳门新萄京官方网站 1

  • 完全使用Polymer的核心元素构建
  • 使用响应式设计
  • 使用数据绑定特性过渡视图
  • 使用URL路由和深层链接特性
  • 可访问键盘
  • 按需动态载入内容(可选)

 打开演示

angular和vue是两个不同的框架,但是所用和所配置的套路几乎相同

1、引入你所要的js

2、路由显示

3、切换路由里面的内容

4、路由就js配置

iscroll.js

page_total_rows - 每页展示数量 默认值20
$total_rows - 总计数据条目数
$totpages - 总页数计算
$pages_current - 当前页面
利用url参数传递 当前页码 url参数名称 pages
$style - 页码展示样式可以通过外部访问样式属性进行修改
***********************使用方法**********************
调用该类
$pages = new pages;
调用该类后请修改数据集总条数
$pages->total_rows = $totrows;
//$pages->main();方法将返回limit需要的2个参数 关联数组的a,b2个元素
$limit = $pages->main();
通过访问不同方法即可展示不同的功能!
欢迎批评指正 联系qq 5213606
*/
class pages{
public $page_total_rows = 20;//每页展示数量
public $total_rows;//总计数据条目数
public $totpages;//总页数
public $current_url;//当前页面名称
private $ask; //是否出现问号
public $style ='<style type="text/css教程">
.pages_norename{width:50px; height:20px; float:left; background-color:#e3eff3; margin-right:5px; text-align:center; line-height:20px; border:1px solid #333333;}
.pages_norename a{display:block; width:50px; height:20px; color:#333333; text-decoration:none;}
.pages_norename a:hover{background-color:#ff9900; color:#ffffff;}
.pages_nore_more{width:auto; height:20px; float:left; margin-right:5px; line-height:20px; background-color:#e3eff3; border:1px solid #333333;}
.pages_nore_more a{display:block; width:20px; height:20px; color:#333333; text-decoration:none; text-align:center;}
.pages_nore_more a:hover{background-color:#ff9900; color:#ffffff;}
.pages_se{width:auto; height:20px; float:left;}
.pages_se select{margin:0px; padding:0px; font-family:arial, helvetica, sans-serif; font-size:12px;}
</style>
';

1.angular  ng-repeat  orderBy 最后一个desc参数一般是true和false,是否逆序,默认是false

<li ng-repeat="item in data | orderBy:sort:desc"></li>

js中实现:

$scope.sort='age';

$scope.data=[{

        name:'mary',

        age:24,

        sex:'female',

        height:'170cm',

        description:'Hi,everyBody,Nice to meet you'

    },    {

        name:'Jackey',

        age:28,

        sex:'male',

        height:'187cm',

        description:'Hi,all,Nice to meet you'

    }];

应用架构

设计布局是开始一个项目的首要任务之一。作为核心元素集合的一部分,Polymer通过几个布局元素 来支撑应用程序的构架(<core-header-panel>, <core-drawer-panel>, <core-toolbar>)。这些组件本身就很好用,但是为了更快地开始项目,我们打算着重于<core-scaffold>。有了它你可以通过组装几个基本的元素就能做出一个响应式的移动端布局。

<core-scaffold>的子元素可以是指定特定的元素或使用特定的标签(或两者一起使用)。举个例子,使用<nav>元素创建应用抽屉菜单。你可以在任意的元素里使用navigation属性(e.g <core-header-panel navigation>)。工具栏通过工具属性标识。它的所有其他子元素都定义在主要内容区域里。

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

1.1、引用插件

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

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

1.4、用.when和.otherwise配置里面的路由规则

iscroll.js 标准版
iscroll-lite.js 精简版 不支持快速、滚动条、鼠标滚轮滚动
iscroll-probe.js 当前滚动位置
iscroll-zoom.js 缩放
iscroll-infinite.js 无限和缓存滚动

//核心计算 并以数组的形式返回查询sql 语句的必须值 limit a,b;
function main(){
  $this->totpages = ceil($this->total_rows/$this->page_total_rows);//总页数计算
  //获得当前页码-------------------
  if(!isset($_get['pages']))
  {
  $this->pages_current = 1;
  }else
  {
   $this->pages_current = intval($_get['pages']);
   //判断页面不为0
   if($this->pages_current < 1){
   $this->pages_current = 1;
   }
   //判断页面不能大于最大页码数量
   if($this->pages_current > $this->totpages){
   $this->pages_current = $this->totpages;
   }
   //注销url 参数 pages 和 total_rows 为了更好的传递其他url参数
   if(isset($_get['pages'])){unset($_get['pages']);}
   if(isset($_get['total_rows'])){unset($_get['total_rows']);}
  
  }
  //获得当前页码--------------------
  $limit['a'] = $start = ($this->pages_current - 1)*$this->page_total_rows;
  $limit['b'] = $this->page_total_rows;
  //获得当前页面名称
  $urlin = explode('/',$_server['php教程_self']);
 
  $tot_url = sizeof($urlin);
  $this->current_url =$urlin[$tot_url-1];
  //获得当前页面传递的url
  if(sizeof($_get) > 0){
   foreach($_get as $key=>$values){
    $urlsget .= $key.'='.$values.'&';
   }
   $this->current_url .= '?'.$urlsget;
   $this->ask = '';
  }else{$this->ask = '?';}
  //输出样式
  echo $this->style;
  return $limit;
}
//展示分页
//1 第一页
function firstpage(){
  echo '<div class="pages_norename"><a href="'.$this->current_url.'">首页</a></div>';
}
//2 上一页
function prepage(){
  echo '<div class="pages_norename"><a href="'.$this->current_url.$this->ask.'pages='.($this->pages_澳门新萄京官方网站:angular和vue的路由切换,Components构建单页面应用。current-1).'">上一页</a></div>';
}
//3 下一页
function nextpage(){
  echo '<div class="pages_norename"><a href="'.$this->current_url.$this->ask.'pages='.($this->pages_current 1).'">下一页</a></div>';
}
//4 最后一页
function  lastpage(){
澳门新萄京官方网站:angular和vue的路由切换,Components构建单页面应用。  echo '<div class="pages_norename"><a href="'.$this->current_url.$this->ask.'pages='.($this->totpages).'">尾页</a></div>';
}
//中间过渡页
function morepage(){
  if($this->pages_current == 1){$newtj = $this->pages_current 9;}
  elseif($this->pages_current  == 2){$newtj = $this->pages_current 8;}
  elseif($this->pages_current == 3){$newtj = $this->pages_current 7;}
  else{$newtj = $this->pages_current 6;}
   for($i=$this->pages_current-3;$i<=$newtj;$i ){
    if($i==$this->pages_current){$strong ='<strong>'; $strong2 ='</strong>';}else{$strong='';$strong2='';}
    if($i >=1){echo '<div class="pages_nore_more"><a href="'.$this->current_url.$this->ask.'pages='.$i.'">'.$strong.$i.$strong2.'</a></div>';}
    if($i >= $this->totpages){
    break;
    }
   }
}
//跳转页面
function changepage(){
  echo '<div class="pages_se"><select name="dd">';
  for($i=1;$i<=$this->totpages;$i ){
  if($this->pages_current == $i){$selected = ' selected="selected"';}else{$selected = '';}
  echo '<option value="'.$i.'"'.$selected.'>第'.$i.'页</option>';
  }
  echo '</select></div>';
}
}
?>
该类可以自动识别 url 参数 避免了一般分页类 丢失url参数问题
样式 可以通过style属性 进行修改
提供 首页 上一页 下一页 尾页 中间 过渡页 跳转菜单功能

2.angular    ui-sref使用

具体用法:<a ui-sref="XXXX"></a>,其中XXXX是路由的$state中名为“XXXX”的state

<a ui-sref="app.system.template_bench({pageId:item.pageId,isDefault:resultData.length})"></a>

路由中的配置:

.state('app.system.template_bench', {

            url: '/template_bench/:pageId/:isDefault',

            templateUrl: 'tpl/system/template_bench.html',

            controller: 'template_bench',

当JavaScript重新生成网页时,它会查找$state中名为“app.system.template_bench”的state,读取这个state的url,然后在a标签里生成href="url",

结果为:<a ui-sref="XXXX" href="#/XXXX.html"></a>

(1)假如动态绑定:

<li repeat="item in items">

<a ui-sref="{{item.statePage}}">{{item.state}}</a>这样是错误的,

ui-sref不支持动态绑定,这样的代码会报错。sref中你只能使用state名,顶多加点参数。

(2)携带参数的ui-sref  :

ui-sref="app.system.template_bench({pageId:item.pageId,isDefault:resultData.length})"对应路由中的参数配置,其实通$state.go()

例子

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>

让我们一起来深入这些内容的每一部分

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

2.1、引用插件

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

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

2.4、用state和.otherwise配置里面的路由规则

不支持 box-shadow opacity text-shadow alpha

3.angular   ui-sref-active

ui-sref-active=”select”

例如

<li ui-sref-active="select" ui-sref="main"><span>首页</span></li>

//这个意思是说如果当前点击的路由是main的话,首先点击这个路由会跳转到main的页面,

 //然后如果当前页面就是它的话,那么就会包含select这个样式类的名称

<li ui-sref-active="select" ui-sref="search"><span>附近</span></li>

抽屉菜单

你放在导航元素里的标记都定义在滑走的应用抽屉菜单里。为了我们的目标 ,我坚持使用标题(<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″>被硬编码为选择第一个条目。我们以后会把它改为动态的。

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

3.1、引用插件

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

3.3、在页面中必须写一个依赖元素

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

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

3.5、配置组件<template></template>,当配置组件的时候,里面是必须要有一个根元素

<template id="home">

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

</template>

3.6、配置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//获取到你配置好的路由

})


4.angular ng-class

ng-class 指令用于给 HTML 元素动态绑定一个或多个 CSS 类。

有三种方法:

1、通过$scope绑定(不推荐)

2、通过对象数组绑定

3、通过key/value键值对绑定

第1种,通过$scope绑定:

function ctrl($scope) {   

$scope.className ="selected";  }

对应的页面:<div class="{{className}}"></div>

第2种, 通过对象数组绑定:

function ctrl($scope) {   

$scope.isSelected =true;  

}  

对应的页面:<div ng-class="{true:'selected',false:'unselected'}[isSelected]"></div>    当isSelected为true时,增加selected样式;当isSelected为false时,增加unselected样式。

第3种, 通过key/value键值对绑定:

function ctrl($scope) {   

$scope.isA =true;  

$scope.isB =false;  

$scope.isC =false;  

}  

对应的页面<div ng-class="{'A':isA,'B':isB,'C':isC}"></div>    当isA为true时,增加A样式;当isB为true时,增加B样式;当isC为true时,增加C样式。

例如:<i ng-class="getIconClass(two)"></i>函数返回的是一个字符串,就是动态添加css属性

工具栏

工具栏横跨了页面顶部并包含了功能按钮图标。满足这种功能的完美元素是<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>

vue2.4.4

5.angular ng-include 和 data-ng-include

都是外部引入html页面,data-ng-include是h5的规范化写法,没区别

一定注意双引号内包含单引号

<div data-ng-include=" 'tpl/blocks/nav.html' "></div>

<div ng-include="'tpl/common/modal.html'"></div>

ng-include写路径方式:

(1)<ng-include src="'views/sidepanel.html'"></ng-include>

  (2)  <div ng-include="'views/sidepanel.html'"></div>  一般静态加载某个页面

  (3)  <div ng-include src="'views/sidepanel.html'"></div>动态的加载一般采用第三种方式

主要内容

最后一部分是为你的内容而留的。它可以是任何的元素。<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)来使内容居中和垂直居中。

npm install -g vue-cli 
vue init webpack demo -y // 公司需要FQ
npm install // 不需要FQ

6.angular ng-controller

绑定应用控制器,为$scope增强

抽离的nav.html中 ,设定ng-controller = "asideCtrl",

<nav ng-controller="asideCtrl">

  <ul class="nav">

     <li class="one-flag" ng-repeat="item in permissionList">

  </ul>

</nav>

,然后对应在应用中main.js中

angular.module('app')

.controller('AppCtrl', ['$scope', '$localStorage', '$window', 'LocalCache', '$state', '$rootScope','AgreeConstant', function($scope, $localStorage, $window, LocalCache, $state, $rootScope,AgreeConstant) {

.controller("asideCtrl", ['$scope', 'LocalCache',

      function($scope, LocalCache) {

        $scope.permissionList = angular.fromJson(LocalCache.getSession("permissionJson"));

        };

      }

    ])

}

至此,nav.html就可以使用asideCtrl控制器中获取的$scope.permissionList 的值进行页面渲染。

创建“视图”

多视图(或者多页面)可以使用<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″>这行代码是硬编码去选择第一页。不过我们以后会把它写成动态的。

现在你应该拥有了一个基本的应用,但是这里有一些小的问题需要注意。多亏了Polymer每个元素提供的布局属性和默认样式,你可以不写任何的CSS代码就可以实现一个响应式应用。当然,从material design调色板里获取一些灵感,设置不到10 CSS规则就可以让这个应该变得更好看。

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

shasum check failed .. 重新安装 npm instal

7.angular ng-click

ng-click="reload(m.blockContentId)" 方法

ng-if="item.pageName"变量

ng-model="map.pageName"变量

使用数据绑定

我们拥有了一个应用,但这不值得一提。这离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的数据绑定特性轻松解决。

【1】check-versions.js 
检测系统的npm node版本是否符合vue的需求,vue指定的版本写在 package.json中
详情:

8.angular json转换

var data = '{"procotol":"HTTP","host":"' activateUrl '","encrypt":false,"body":{"requestType":"PUT","tag":"' activateUrl '","upJson":{"activationCode":"' $scope.activeCode.text '"}}}'; //=====json字符串=====

angular.fromJson(data);  //===执行此操作转换成json对象

angualr.toJson("json字符串")//====执行此操作把json对象转换成json字符串

自动绑定模板(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-*来声明事件处理器。

【2】dev-server.js 
默认 process.env.NODE_ENV 值为 undefined , process.env.PORT 也为 undefined

9.函数向上取整-Math.ceil

Math.ceil(3.5)==》向上取整4

使用数据模型( data model)简化标记

利用数据模型来产生标记可以大量减少你写标记的数量。在我们的案例里,所有的菜单条目和页面都可以利用一对<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属性来关联在一起。现在,当用户点击一个导航条目时,页面会做出相应的更新。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}}">

展示

先看项目结构分析
build中 webpack.base.conf.js 引入 vue-loader.conf.js

10.获取页面元素

对应页面html中:

<div id="itemsDiv"></div>

对应js页面中:

var itemsDov = document.getElementById("itemsDiv");

 itemsDov.style.width = $scope.itemsData.length * 360 "px";

URL路由(URL routing)和深层链接

<flatiron-director>是一个包装了flatiron director JS library(一个JS库)的web组件。改变它的route属性把URL#号(URL hash)更新到相同的值。

当我们想在页面加载时维持上次的视图时,数据绑定再次派上用场。把路由(director.js里的director)、菜单和页面元素连接起来并使它们同步。当一个更新时,其他的同样跟着更新。

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;
};

npm run dev
dev-server.js 中 使用 opn模块,自动打开浏览器
dev-server.js 引入 webpack.dev.conf.js
webpack.dev.conf.js 引入 webpack.base.conf.js alias 简写在这里

11.元素定位

其他路由库

如果你不喜欢<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>

一、absolute绝对定位:

特点:

a.会从文档流中脱离,不受其他元素影响,定位是绝对的,绝对定位的元素在文档流中没有位置,从文档流中脱离了出来,会面的元素会填充掉它原来的位置。

b.定位位置相对于第一个具有定位属性(即:position为relative或者为absolute属性)的祖先元素。

当给元素设置绝对定位值时:

     该元素会延着DOM树向上查找,直到找到一个具有定位属性的祖先元素,则定位会相对于该元素。

     若祖先元素都没有定位属性,则会相对于body体进行定位

c.绝对定位的高级特性:

   具有自动伸缩功能,将width设置为auto(或不设置,默认为auto),绝对定位元素会根据其left和right 自定伸缩其大小。例如:

注意:left、right必须要相等,且不超过其相对元素减去该绝对定位元素width的一半

键盘导航

键盘支持的重要性不仅仅是为了方便的访问,它同样会使SPA用户刚到更开心。

<core-a11y-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>

直接修改package.json npm install 
node_modules 包文件更新了,项目本地环境会报错

absolute应用---左右居中设置,margin左右auto

(1)左右居中,定位元素会呈现居中状态,margin:0 auto 定宽 左右left、right相等:

澳门新萄京官方网站,{ position:absolute;  left:0;  right:0;  width:50px;  margin:0 auto;}

(2)定位元素占满父元素的宽度:

{ position:absolute;  left:0;  right:0 }

(3)优先取left值作为定位标识,结合width宽度显示

{ position:absolute;  left:0;  right:0; width:50px;  }

注意

事件的target属性数据绑定到我们的自动绑定模块的parentElement属性。在这个案例里,它是<body>元素。

key属性包含一个以空格分隔元素的列表,列表中包含了要监听键位。当这些组合的其中一个被按下,<core-a11y-keys>触发一个keys-pressed事件并调用你的回调函数。

keys-pressed事件的处理器使用<core-animated-pages>的selectNext/selectPrevious API去进入下一页或者返回上一页:

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;
  }
};

package.json 
"dependencies"{
"vue": "^2.1.10", ->2.4.2
"vue-router": "^2.1.1" ->2.7.0
vux-> mint ui 2.2.9
vue-loader : ^10.3.0 从8.3.0(提示只适合vue1.0)升级到10.3.0,会报错
vuex-> vuex 2.3.1 
{

absolute应用---垂直居中设置,margin上下auto

{ position:absolute;  width:100px; height:50px;  margin:auto 0; top:0; bottom:0; }

按需加载内容

如果你想用户在你的应用里导航时动态加载内容要怎样做?只需一些改动,我们就可以支持动态加载页面。

首先,更新数据模型,使它包含内容的URL:

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。这意味着,无论什么时候一个新的菜单条目被选中,XHR(XMLHttpRequest的缩写,译者注)就会去获取相应的页面。当core-response触发时,onResponse就会把文档返回的一部分插入预先保留的容器里。

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实例演示

入口文件要引入
import Vue from 'vue'

二、相对定位 relative

特点:

a.相对定位指的是它原本在文档流中的位置而进行的偏移

b.使用相对定位时,无论是否进行移动,元素仍然占据原来的空间

c.一直相对的是它自身的初始位置

z-index 调整堆叠顺序,定位元素沿Z轴的位置,为正数则离用户更近,为负数,则离用户更远。

特点:拥有更高堆叠顺序的元素总是处于堆叠顺序较低的元素的前面,更靠近用户,可有负值,仅在定位元素上有效。z-index:1;靠近用户在前,z-index:-1远离用户,在后。

润饰和收尾

这里有一些小技巧和诀窍你可以用来改善你的应用。

当一个菜单条目被选择后,关闭应用的抽屉菜单(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();
  }
};

为导航选择条目设置不同的图标:

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);
};

路由要重新写

三、固定定位 fixed

特点:

a、元素position被设置为fixed时,这个元素就被固定住了,被固定的元素不会随着滚动条的拖动而改变位置,在视野中,元素的位置是不会改变的。

b、定位的是距离浏览器的位置,始终不变。

c 、常用于页面上的返回顶部按钮

{ position:fixed; top:30px;  left:160px; width: 60px;  height:60px;  }

结束语

现在,你应该了解使用Polymer和web组件构建的单页应用的基本构架了。这可能和构建传统的应用有所不同,但总的来说,组件让事情变得简单多了。当你重用(核心)组件和使用Polymer的数据绑定特性时,你可以写更少的CSS/JS。可以写更少的代码的感觉真好!

赞 收藏 评论

ready 变成 mounted

12、浮动 float

概念:

设置了float属性的元素为浮动元素,浮动元素会从普通文档流中脱离,但浮动元素影响的不仅是自己,它会影响周围的元素对齐进行环绕。

包含块:浮动元素的包含块就是离浮动元素最近的块级祖先元素。

关于作者:周进林

澳门新萄京官方网站 2

茫茫大海中的一枚程序猿,为了进化为一个高富帅人类而努力着。关注java、python、linux、vim等(新浪微博:@酒肉和尚--进林) 个人主页 · 我的文章 · 20 ·  

澳门新萄京官方网站 3

1.识别不了template 
You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.

块级元素-block element

每个块级元素默认占一行高度,一行内增加一个块级元素后,一般无法添加其他元素(元素浮动后除外),两个块级元素连续编辑时,会在页面自动换行显示,块级元素一般可嵌套块级元素或行内元素,宽度缺省为100%,除非设定宽度。

块级元素常见:address blockquote块引用、center居中对齐块 、dir-目录列表  div   dl-定义列表

form-交互表单、 h-标题、    hr-水平分界线、menu-菜单列表 、ol-有序列表  ul--无序列表 p--段落

pre--格式化文本  table--表格

webpack配置文件添加 
alias:{
'vue': 'vue/dist/vue.js' // 这个
}

内联元素-inline element:

和其他元素都在一行上,

高、行高、内边距、外边距不可改变,width、height无效,可设置line-height

宽度就是它的文字或者图片的宽度,不可改变,宽度随内容的变化而变化

margin只有 margin-left,margin-right有效,上下无效

padding只有padding-left,padding-right有效,上下无效

vue-router要修改

浮动元素的特性:

不管一个元素是行内元素还是块级元素,如果被设置了浮动,那浮动元素会生成一个块级框,可以设置它的width和height ,    因此float常用作制作横向排列的菜单,可以设置大小并且横向排列。

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

浮动元素展示规则:

a、浮动元素在float的时候,其margin不会超过包含块的padding ,默认正常情况下不会超出,但也可控制浮动元素的margin为负值超出,碰撞到包含块的padding停止。

b、如果有多个浮动元素,浮动元素会按顺序排下来而不会发生重叠的现象。

c、包含块元素的宽度足够大,两个元素一个向左float,一个向右float,互相无交集,

      如果父包含块的宽度小于两个浮动元素的宽度总和,一个左float,一个右float,那么后面的元素将会向下浮动,其顶端是前面浮动框的底端。

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

import Vue from 'vue'
import Router from 'vue-router'
import App from '../components/App'
Vue.use(Router)

const Foo = {template: '<div>foo</div>'}
const Bar = {template: '<div>bar</div>'}

const routes = [
{path: '/foo', component: Foo},
{path: '/bar', component: Bar},

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

const router = new Router({
routes // (缩写)相当于 routes: routes
})

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

App.vue
<template>
<div class="app">
this is app
<router-link to="/foo">Go to Foo</router-link>
<router-link to="/bar">Go to Bar</router-link>
<router-view></router-view>
</div>
</template>

index.hbs
<div id="app"></div>

webpack.config.js
alias:{
'vue':'vue/dis/vue.js'
}

【2】vue-loader 从8.3.0(适合vue1.0)升级到10.3.0 页面报错 ,页面只有一个根元素,不能使用两个 :disabled , 不能使用关键字作为变量
【3】样式在 style.less 中 @import "mintui.css"; 先把css集中在一个文件
【4】vuex
核心 store (仓库) 包含 state (状态)
vue组件读取state,当state变化,组件会响应式更新
必变state的途径 【显式提交commit mutations 】

main.js

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

const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count
}
},
getters: { // getters
getState: state => {
return state.count 10
},
actions: { // action 提交mutation
increment ({commit}, val) {
commit(Mutation.INCREMENT, val) 
}
}
}
})

store.commit('increment') // 最初提交mutation
console.log(store.state.count) // 1

new Vue({
router,
store, // 把store加进来
render: h => h(App)
}).$mount('#app')

{{test}} 
页面调用,通过计算属性 
computed: {
test () {
return this.$store.state.count 
}
},
页面调用 getters

mounted:{
console.log(this.$store.getters.getState)
}

// 使用 mapGetters辅助函数,控制台会有警告

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

mutation 是同步函数 可以实现action的功能, 
action提交的是 mutation,可以异步操作 
mutation直接变状态

action 不支持传入对象

 

main.js 入口文件添加 new Vuex.Store({ state ,mutation,getters,actions });
最终整理

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

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

app.vue 保存this 到window,供其他页面使用
window.xxx=function(){
return this;
}

<style lang="less" rel="stylesheet/less" scoped>

<li :class="{chosen:ischosen==($index)}" @click="select($index)">
.chosen{
color:red;
}
function select(index){
this.$data.ischosen = index
}
自定义打勾图片则每个li都要添加该图片

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

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

<div @click.stop>

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

document.title=xxx

 


sourceTree 1.9.6.2

占位图,先显示占位图,当轮播时,替换成真正的图片 swiper的自动轮播方法是 OnAutoplay

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()

server.use(middlewares)

server.get('/xx', function (req, res) {
res.jsonp(userRouter.db.get('getxx'))
})

server.listen(3000, function () {
console.log('JSON-Server is Running')
})

 

 

传:encodeURIComponent(JSON.stringfy(xxx));
收:JSON.parse(decodeURIComponent(xxx))

addScript (src, success, error) {
let script = document.createElement('script')
script.src = src
document.body.appendChild(script)
script.onload = function () {
success()
}
script.onerror = function () {
error()
}
},

var count=0;
function startLoad(){
_this.addScript('xxx.js', function () {
_this.xxxx();
}, function () {
count
if (count < 4) startLoad() // 失败再调用
})
}
startLoad();

 

 

 

var Demo = function(callback){
this.callback=callback
}
Demo.prototype={
xxx:function(){
if (typeof _this.callback == 'function') {
_this.callback(xxx);
}
}
}

 

var xx = new Demo(function(data){
alert(data);
}}

 

 

<style>
  /*1.样式 :not*/
  li:not(:last-child) { /* 最后一项li不应用样式*/
    list-style: none;
    border-bottom: 1px solid #0000ff;
  }
</style>

json-server --watch a.json -r ./routes.json

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

本文由澳门新萄京官方网站发布于澳门新萄京赌场网址,转载请注明出处:澳门新萄京官方网站:angular和vue的路由切换,

关键词: