第 1 章 Vue.js 基础 为什么选择 Vue.js 使用框架,项目代码可维护程度提高,简化了大部分工作。
使用 Ajax 下载一个列表数据并在页面上显示。
jQuery
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <ul class="js-items"></ul> <script>   $(function(){     $.get('https://example.com/items.json')       .then(function(data){         ar $itemUL = $('.js-items');         if(! data.items.length){           var $noItems = $('li');           $noItems.text('Sorry,there are no items');           $itemsUl.append($noItems);         }else{           data.items.forEach(function(item){             var $newItem = $('li');             $newItem.text(item);             if(item.includes('blue')){               $newItem.addClass('is-blue');             }             $itemUl.append($newItem);           })         }       })   }) </script> 
这段代码执行了以下逻辑:
Vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <ul  class ='js-items' >   <li  v-if ='! items.length' >  Sorry, there are no items. </li >    <li  v-for ="item in items"  :class ="{'is-blue': item.includes('blue')}" >      {{item}}   </li >  </ul > <script >   new  Vue({     el: '.js-items' ,     data: {       items: []     },     created (       fetch('https://example.com/items.json' )         .then((res ) =>  res.json())         .then((data ) => {           this .items = data.items;         })     }   }) </script > 
这段代码执行了以下逻辑:
vue-router 用于路由控制——根据应用的不同URL来显示不同的内容。
安装和设置 安装 Vue 不需要任何特殊的工具,使用下面的代码就可以实现:
1 2 3 4 5 6 7 8 9 10 11 <div  id ="app" > </div > <script >   new  Vue({     el: '#app' ,     created (            }   }) </script > 
1、有一个 ID 为 app 的 div 元素用于初始化 Vue。
vue-loader和webpack vue-loader是一个webpack的加载器,允许组件的所有HTML、JavaScript和CSS代码编写到同一个文件中。
webpack
1 2 3 4 5 6 7 8 9 module: {   loaders: [     {       test: /\.vue$/,       loader: 'vue',     }     // ... 其他加载器 ...   ] } 
如果还没有配置好 webpack 或者 不知如何添加vue-loader,可以使用一份现成的模板来初始化 Vue 项目。
Vue-cli
bach 1 2 $ npm install --global vue-cli $ vue init webpack 
模板(Template)、数据(Data)和指令(Directive) Vue 的核心是将数据显示在页面上,这一功能通过模板实现。为正常的HTML添加特殊的属性——被称作指令——借助它来告诉 Vue 我们想要实现的效果以及如何处理提供给它的数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <div  id ="app" >   <p  v-if ="isMorning" >  早上好! </p >    <p  v-if ="isAfternoon" >  中午好! </p >    <p  v-if ="isEvening" >  晚上好! </p >  </div > <script >   var  hours = new  Date ().getHours();   new  Vue({     el: '#app' ,     data: {       isMorning: hours < 12,       isAfternoon: hours >= 12 && hours < 18,       isEvening: hours >= 18     }   }); </script > 
v-if
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <div  id ="app" >   <p  v-if ="hours < 12" >  早上好! </p >    <p  v-if ="hours >= 12 && hours < 18" >  中午好! </p >    <p  v-if ="hours >= 18" >  晚上好! </p >  </div > <script >   new  Vue({     el: '#app' ,     data: {       hours: new  Date ().getHours()     }   }); </script > 
插值
1 2 3 4 5 6 7 8 9 10 11 12 <div id="app">   <p>Hello, {{ greetee }}! </p> </div> <script>   new Vue({     el: '#app',     data: {       greetee: 'world'     }   }); </script> 
插值和指令结合
1 2 3 4 5 6 7 8 9 10 11 12 <div id="app">   <p v-if="path === '/'">你正位于首页</p>   <p v-else> 你正位于 {{ path }} </p> </div> <script>   new Vue({     el: '#app',     data: {       path: location.pathname     }   }); </script> 
location.pathname 是当前页面URL的路径值。
传递数组或对象
1 2 3 4 5 6 7 8 9 10 11 12 13 <div  id ="app" >   <p > 第二条狗的名字是 {{ dogs[1] }}</p >    <p > 所有狗的名字是 {{ dogs }} </p >  </div > <script >   new  Vue({     el: '#app' ,     data: {       dogs: ['Rex' ,'Rover' ,'Henrietta' ,'Alan' ]     }   }); </script > 
v-if vs v-show v-if
1 2 <div  v-if ="true" > one</div > <div  v-if ="false" > two</div > 
输出内容
v-show
v-show 指令使用CSS样式控制元素的 显示/隐藏 。
1 2 <div v-show="true">one</div> <div v-show="false">two</div> 
输出内容
1 2 <div > one</div > <div  style ='display: none' > two</div > 
使用 v-if 隐藏的内部元素不会被显示,Vue 不会尝试生成对应的HTML代码;
示例:抛出一个异常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <div  id ="app" >  <div  v-show ="user" >     <p > User name: {{ user.name }}</p >   </div >  </div > <script >  new  Vue({    el: '#app' ,    data: {      user: undefined     }  }) </script > 
会抛出异常是因为 Vue 尝试执行user.name —— 一个尚不存在的对象的属性。在该示例中如果使用v-if就会正常工作,因为 Vue 直到v-if语句为真时才会去尝试生成元素的内部内容。
v-if v-else-if v-else
1 2 3 4 5 6 7 8 9 <div  v-if ="state === 'loading'" >  加载中 </div > <div  v-else-if ="state === 'error'" >  出错了 </div > <div  v-else >  ... 我们的内容! </div > 
使用 v-if 会有性能开销。每次插入或者移除元素时都必须要生成元素内部的 DOM 树,这在某些时候是非常大的工作量。而 v-show 除了在初始创建开销时之外没有额外的开销。如果希望频繁地切换某些内容,那么v-show会是最好的选择。
如果元素包含任何图片,那么仅使用CSS隐藏父节点可以使浏览器在图片显示之前就加载它,这意味着一旦v-show变为真值,图片就可以显示出来。如果是v-if指令,图片会直到要显示时才开始加载。