Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解

前端之家收集整理的这篇文章主要介绍了Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、Vue的实例

1.1、创建一个 Vue 的实例

每个 Vue 应用都是通过 Vue 函数创建一个新的 Vue 实例开始的:

虽然没有完全遵循 MVVM 模型,Vue 的设计无疑受到了它的启发。因此在文档中经常会使用 vm (viewmodel 的简称) 这个变量名表示 Vue 实例。

1、vue.js就是一个构造器,通过构造器Vue来实例化一个对象;例如:var vm = new Vue({});

2、实例化Vue时,需要传入一个参数(选项对象);

3、参数:选项对象可以包含,数据(data)、挂载元素(el)、方法(methods)、模版(template)、生命周期函数等等;

4、扩展构造器Vue,从而用预定义选项创建可复用的组件构造器,所有组件都是被扩展的Vue的实例,使用Vue.extend({})来扩展;

注意:尽管可以命令式地创建扩展实例,不过在多数情况下建议将组件构造器注册为一个自定义元素,然后声明式地用在模板中。

当创建一个 Vue 实例时,你可以传入一个选项对象。这篇教程主要描述的就是如何使用这些选项来创建你想要的行为。作为参考,你也可以在 API 文档 中浏览完整的选项列表。

一个 Vue 应用由一个通过 new Vue 创建的根 Vue 实例,以及可选的嵌套的、可复用的组件树组成。举个例子,一个 todo 应用的组件树可以是这样的:

我们会在稍后的组件系统章节具体展开。不过现在,你只需要明白所有的 Vue 组件都是 Vue 实例,并且接受相同的选项对象即可 (一些根实例特有的选项除外)。

1.2、数据与方法

当一个 Vue 实例被创建时,它向 Vue 的响应式系统中加入了其 data 对象中能找到的所有的属性。当这些属性的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。

true // 设置属性也会影响到原始数据 vm.a = 2 data.a // => 2 // ... 反之亦然 data.a = 3 vm.a // => 3

当这些数据改变时,视图会进行重渲染。 值得注意的是只有当实例被创建时 data 中存在的属性是响应式的 。也就是说如果你添加一个新的属性,像:

那么对 b 的改动将不会触发任何视图的更新。

示例:

<Meta charset="UTF-8"> vue2实例@H_<a href="https://www.jb51.cc/tag/404/" target="_blank" class="keywords">404</a>_49@ </head> <body> <div id="app1"> <input type="text" v-model="a"/> </div> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var data={a:1} //实例 var vm = new Vue({ el: "#app1",data:data,updated:function(){ console.log("实例被更新了!"); } }); </script> </body> </html></pre> </div> <p>结果:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300033.png" /></p></p> <p>如果你知道你会在晚些时候需要一个<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>,但是一开始它为空或不存在,那么你仅需要设置一些初始值。比如:</p> <div class="jb51code"> <pre class="brush:js;"> data: { newTodoText: '',visitCount: 0,hideCompletedTodos: false,todos: [],error: null }</pre> </div> <p>除了 data <a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>,Vue 实例暴露了一些有用的实例<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>与<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>。它们都有前缀 $,以便与<a href="https://www.jb51.cc/tag/yonghu/" target="_blank" class="keywords">用户</a>定义的<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>区分开来。例如:</p> <div class="jb51code"> <pre class="brush:js;"> var data = { a: 1 } var vm = new Vue({ el: '#example',data: data }) vm.$data === data // => true vm.$el === document.getElementById('example') // => true // $watch 是一个实例<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a> vm.$watch('a',function (newValue,oldValue) { // 这个回调将在 `vm.a` 改变后<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a> })</pre> </div> <p>在未来,你可以在 API 参考查阅到完整的实例<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>和<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>的列表 。</p> <p>1.3、实例<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a></p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300034.png" /></p></p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300035.png" /></p></p> <p>解释</p> <div class="jb51code"> <pre class="brush:js;"> vm._uid // 自增的id vm._isVue // 标示是vue对象,避免被observe vm._renderProxy // Proxy代理对象 vm._self // 当前vm实例 vm.$parent // 用于自定义子组件中,指向父组件的实例 vm.$root // 指向根vm实例 vm.$children // 当前组件的子组件实例数组 vm.$refs vm._watcher = null vm._inactive = null vm._directInactive = false vm._isMounted = false // 标识是否已挂载 vm._isDestroyed = false // 标识是否已销毁 vm._isBeingDestroyed = false // 标识是否正在销毁 vm._events // 当前元素上绑定的自定义事件 vm._hasHookEvent // 标示是否有hook:开头的事件 vm.$vnode // 当前自定义组件在父组件中的vnode,等同于vm.$options._parentVnode vm._vnode // 当前组件的vnode vm._staticTrees // 当前组件模板内分析出的静态内容的render函数数组 vm.$el // 当前组件对应的根元素 vm.$slots // 定义在父组件中的slots,是个对象键为name,值为响应的数组 vm.$scopedSlots = emptyObject // 内部render函数使用的创建vnode的方法 vm._c = (a,b,c,d) => createElement(vm,a,d,false) // <a href="https://www.jb51.cc/tag/yonghu/" target="_blank" class="keywords">用户</a><a href="https://www.jb51.cc/tag/zidingyi/" target="_blank" class="keywords">自定义</a>render<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>时,传入的参数 vm.$createElement = (a,true) vm._props // 被observe的存储props数据的对象 vm._data // 被observe的存储data数据的对象 vm._computedWatchers // 保存计算<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>创建的watcher对象</pre> </div> <p>1.4、实例<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a></p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300036.png" /></p></p> <p style="text-align: left">1.5、实例参数vm.$options</p> <p><code>vm.$options</code>其实也就是我们<code>new Vue(options)options</code>这个选项对象可传入的<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a></p> <div class="jb51code"> <pre class="brush:js;"> declare type ComponentOptions = { // data data: Object | Function | void; // 传入的data数据 props?: { [key: string]: PropOptions }; // props传入的数据 propsData?: ?Object; // 对于自定义组件,父级通过`props`传过来的数据 computed?: { // 传入的计算属性 [key: string]: Function | { get?: Function; set?: Function; cache?: boolean } }; methods?: { [key: string]: Function }; // 传入的方法 watch?: { [key: string]: Function | string }; // 传入的watch // DOM el?: string | Element; // 传入的el字符串 template?: string; // 传入的模板字符串 render: (h: () => VNode) => VNode; // 传入的render<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a> renderError?: (h: () => VNode,err: Error) => VNode; staticRenderFns?: Array<() => VNode>; // <a href="https://www.jb51.cc/tag/gouzihanshu/" target="_blank" class="keywords">钩子函数</a> beforeCreate?: Function; created?: Function; beforeMount?: Function; mounted?: Function; beforeUpdate?: Function; updated?: Function; activated?: Function; deactivated?: Function; beforeDestroy?: Function; destroyed?: Function; // assets directives?: { [key: string]: Object }; // 指令 components?: { [key: string]: Class<Component> }; // 子组件的定义 transitions?: { [key: string]: Object }; filters?: { [key: string]: Function }; // 过滤器 // context provide?: { [key: string | Symbol]: any } | () => { [key: string | Symbol]: any }; inject?: { [key: string]: string | Symbol } | Array<string>; // component v-model customization model?: { prop?: string; event?: string; }; // misc parent?: Component; // 父组件实例 mixins?: Array<Object>; // mixins传入的数据 name?: string; // 当前的组件名 extends?: Class<Component> | Object; // extends传入的数据 delimiters?: [string,string]; // 模板分隔符 // 私有<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>,均为内部创建<a href="https://www.jb51.cc/tag/zidingyi/" target="_blank" class="keywords">自定义</a>组件的对象时使用 _isComponent?: true; // 是否是组件 _propKeys?: Array<string>; // props传入对象的键数组 _parentVnode?: VNode; // 当前组件,在父组件中的VNode对象 _parentListeners?: ?Object; // 当前组件,在父组件上绑定的事件 _renderChildren?: ?Array@H_<a href="https://www.jb51.cc/tag/404/" target="_blank" class="keywords">404</a>_111@; // 父组件中定义在当前元素内的子元素的VNode数组(slot) _componentTag: ?string; // <a href="https://www.jb51.cc/tag/zidingyi/" target="_blank" class="keywords">自定义</a><a href="https://www.jb51.cc/tag/biaoqian/" target="_blank" class="keywords">标签</a>名 _scopeId: ?string; _base: Class<Component>; // Vue _parentElm: ?Node; // 当前<a href="https://www.jb51.cc/tag/zidingyi/" target="_blank" class="keywords">自定义</a>组件的父级dom结点 _refElm: ?Node; // 当前元素的nextSlibing元素,即当前dom要插入到_parentElm结点下的_refElm前 }</pre> </div> <p>1.5.1、computed计算<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a></p> <p>在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作。在模板中放入太多的逻辑会让模板过重且难以维护。例如:</p> <div class="jb51code"> <pre class="brush:js;"> <span>{{msg.split('').reverse().join('')}}</span></pre> </div> <p>使用计算<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>定义成一个<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>可以复用且模板会更加简洁:</p> <div class="jb51code"> <pre class="brush:js;"> <!DOCTYPE html> <html> <head> <<a href="https://www.jb51.cc/tag/Meta/" target="_blank" class="keywords">Meta</a> charset="UTF-8"> <title>vue2实例@H_<a href="https://www.jb51.cc/tag/404/" target="_blank" class="keywords">404</a>_49@ </head> <body> <div id="app1"> <p> <input type="text" v-model="msg" /> <span>{{msg.split('').reverse().join('')}}</span> </p> <p> <input type="text" v-model="msg" /> <span>{{revMsg}}</span> </p> </div> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var app1 = new Vue({ el: "#app1",data: { msg: "hello" },computed: { revMsg: function() { return this.msg.split('').reverse().join(''); } } }); </script> </body> </html></pre> </div> <p>结果:</p> <p><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300037.png" /></p></p> <p><h3>注意:</h3></p> <p>1、computed中定义的<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>只允许当着<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>用,不能带参数,这限制它的复用性。</p> <p>2、当<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>中的<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>发生变化时<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>将重新<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a></p> <p>3、不应该使用箭头<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>来定义计算<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a><a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a></p> <p>4、computed计算<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>可以对<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>进行缓存的,计算<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>只有当该<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>发生变化的时候才会重新计算值</p> <p>5、如果一个<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>不能完成需要的<a href="https://www.jb51.cc/tag/gongneng/" target="_blank" class="keywords">功能</a>时可以考虑转成计算</p> <p>1.5.2、watch计算<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a></p> <p>一个对象,键是需要观察的表达式,值是对应回调<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>。值也可以是<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>名,或者包含选项的对象。Vue 实例将会在实例化时<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a> $watch(),遍历 watch 对象的每一个<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>。</p> <p>示例:</p> <div class="jb51code"> <pre class="brush:js;"> <!DOCTYPE html> <html> <head> <<a href="https://www.jb51.cc/tag/Meta/" target="_blank" class="keywords">Meta</a> charset="UTF-8"> <title>vue2实例@H_<a href="https://www.jb51.cc/tag/404/" target="_blank" class="keywords">404</a>_49@ </head> <body> <div id="app1"> <p> a: <input type="text" v-model="a" />{{a}}<br/> b: <input type="text" v-model="b" />{{b}}<br/> c: <input type="text" v-model="c.x.y.z" />{{c.x.y.z}}<br/> d: <input type="text" v-model="d" />{{d}}<br/> </p> <p> n:<input type="text" v-model="c.x.y.n" />{{c.x.y.n}} </p> </div> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var app1 = new Vue({ el: "#app1",data: { a: 1,b: 2,c: { x: { y: { z: 3,n: 3 } } },d: 4 },watch: { a: function(val,oldVal) { console.log('a新: %5s,原: %5s',val,oldVal); },// <a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>名 b: 'watchb',//对象,深度监视 c: { handler: function(val,oldVal) { console.log('c新: %5s,JSON.stringify(val),JSON.stringify(oldVal)); },deep:true },//立即监视 d: { handler: function(val,immediate:true //设置初始值时也将<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a> } },methods: { watchb: function(val,oldVal) { console.log('b新: %5s,oldVal); } } }); var watchb = function(val,oldVal) { console.log('b新: %5s,oldVal); } </script> </body> </html></pre> </div> <p>结果:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300038.png" /></p></p> <p>注意:不应该使用箭头<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>来定义 watcher <a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>、对象类型时并非深拷贝的,只是引用。</p> <p>1.5.3、<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>methods</p> <p>methods 将被混入到 Vue 实例中。可以直接通过 VM 实例访问这些<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>,或者在指令表达式中使用。<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>中的 this <a href="https://www.jb51.cc/tag/zidong/" target="_blank" class="keywords">自动</a>绑定为 Vue 实例。</p> <div class="jb51code"> <pre class="brush:js;"> var vm = new Vue({ data: { a: 1 },methods: { plus: function () { this.a++ } } }) vm.plus() vm.a // 2</pre> </div> <p>示例:</p> <div class="jb51code"> <pre class="brush:js;"> <!DOCTYPE html> <html> <head> <<a href="https://www.jb51.cc/tag/Meta/" target="_blank" class="keywords">Meta</a> charset="UTF-8"> <title>vue2实例@H_<a href="https://www.jb51.cc/tag/404/" target="_blank" class="keywords">404</a>_49@ </head> <body> <div id="app1"> <button type="button" v-on:click="add(2)">{{msg}}</button> </div> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var app1 = new Vue({ el: "#app1",data:{ msg:"vue" },methods:{ add:function(str){ return this.msg+=str; } } }); console.log(app1.add(3)); </script> </body> </html></pre> </div> <p>结果:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300039.png" /></p></p> <p>注意,不应该使用箭头<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>来定义 method <a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a> (例如 plus: () => this.a++)。理由是箭头<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例,this.a 将是 undefined。</p> <p>1.5.4、小结</p> <p>computed是计算<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>的,methods是计算<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>的,最主要的区别是 computed计算<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>可以对</p> <p><a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>进行缓存的,计算<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>只有当该<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>发生变化的时候才会重新计算值,只要值没有改变,它是不会重新渲染的,但是methods<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>不同,每次<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>该<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>的时候,都会重新执行的。</p> <p>1、每个Vue的实例都会代理其data对象里的所有<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>,被代理的<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>是响应的;</p> <p>2、如果实例创建之后<a href="https://www.jb51.cc/tag/tianjia/" target="_blank" class="keywords">添加</a>新的<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>到实例上,不会触发视图更新;</p> <p>3、不要在实例<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>或者回调<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>中(如 vm.$watch('a',newVal => this.myMethod()))使用箭头<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>。因为箭头<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>绑定父上下文,所以 this 不会像预想的一样是 Vue 实例,而是 this.myMethod 未被定义。</p> <p>4、Vue实例暴露了一些有用的实例<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>和<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>,带有前缀 $ 便于与代理的data区分</p> <p>a、vm.$el:类型(HTMLElement)挂载元素,Vue实例的DOM根元素;</p> <p>b、vm.$data:类型(Object),Vue实例观察的数据对象</p> <p>c、vm.$props:类型(Object),<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a></p> <p>d、vm.$options:类型(Object),用于当前Vue实例的初始化选项,在选项中需要包含<a href="https://www.jb51.cc/tag/zidingyi/" target="_blank" class="keywords">自定义</a><a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>的时候很有用。</p> <p>e、vm.$parent:类型(Vue实例),父实例。</p> <p>f、vm.$root:类型(Vue实例),当前组件树的根Vue实例,如果没有父实例,就是实例本身。</p> <p>h、vm.$children:类型(Array(Vue实例)),当前实例的直接子组件</p> <p>需要注意 $children 并不保证顺序,也不是响应式的。如果你发现自己正在尝试使用 $children 来进行数据绑定,考虑使用一个数组配合 v-for 来<a href="https://www.jb51.cc/tag/shengcheng/" target="_blank" class="keywords">生成</a>子组件,并且使用 Array 作为真正的来源。</p> <p>i、vm.$slots:类型({ [name: string]: ?Array@H_<a href="https://www.jb51.cc/tag/404/" target="_blank" class="keywords">404</a>_111@ }),用来访问被 slot 分发的<a href="https://www.jb51.cc/tag/neirong/" target="_blank" class="keywords">内容</a>。每个具名 slot 有其相应的<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>(例如:slot="foo" 中的<a href="https://www.jb51.cc/tag/neirong/" target="_blank" class="keywords">内容</a>将会在 vm.$slots.foo 中被找到)。default <a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a><a href="https://www.jb51.cc/tag/baokuo/" target="_blank" class="keywords">包括</a>了所有没有被包含在具名 slot 中的节点。</p> <p>k、vm.$refs:类型(Object),一个对象,其中包含了所有拥有 ref <a href="https://www.jb51.cc/tag/zhuce/" target="_blank" class="keywords">注册</a>的子组件;</p> <p>l、vm.$isServer:类型(boolean),当前Vue实例是否运行于服务器;</p> <p>官网对应</p> <p>1.5.5、箭头<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a></p> <p>箭头<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>是ES6引入的一种语法糖,使得写<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>更加简便,类似Lambda表达式,基本格式如下:</p> <p>()=>{}</p> <p>示例:</p> <div class="jb51code"> <pre class="brush:js;"> <!DOCTYPE html> <html> <head> <<a href="https://www.jb51.cc/tag/Meta/" target="_blank" class="keywords">Meta</a> charset="UTF-8"> <title>vue2实例@H_<a href="https://www.jb51.cc/tag/404/" target="_blank" class="keywords">404</a>_49@ </head> <body> <div id="app1"> </div> <script type="text/javascript"> var m1=a=>a+1; console.log(m1(100)); //类似 var m2=function(a){ return a+1; } console.log(m2(100)); <p>var m3=(a,b)=>a+b;<br /> console.log(m3(100,200));</p> <p>var m4=(a,b)=>{a++; b++; return a+b;}; //如果<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>体中有多个表达式,则需要大括号与return<br /> console.log(m4(100,200));</p> </script> </body> </html></pre> </div> <p>结果:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300040.png" /></p></p> <p><h3>二、生命周期 2.1、实例生命周期</h3></p> <p>每个 Vue 实例在被创建之前都要经过一系列的初始化过程。例如需要设置数据监听、编译模板、挂载实例到 DOM、在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>,给予<a href="https://www.jb51.cc/tag/yonghu/" target="_blank" class="keywords">用户</a>机会在一些特定的场景下<a href="https://www.jb51.cc/tag/tianjia/" target="_blank" class="keywords">添加</a>他们自己的<a href="https://www.jb51.cc/tag/daima/" target="_blank" class="keywords">代码</a>。</p> <p>比如 created 钩子可以用来在一个实例被创建之<a href="https://www.jb51.cc/tag/houzhixing/" target="_blank" class="keywords">后执行</a><a href="https://www.jb51.cc/tag/daima/" target="_blank" class="keywords">代码</a>:</p> <div class="jb51code"> <pre class="brush:js;"> new Vue({ data: { a: 1 },created: function () { // `this` 指向 vm 实例 console.log('a is: ' + this.a) } }) // => "a is: 1"</pre> </div> <p>也有一些其它的钩子,在实例生命周期的不同场景下<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>,如 mounted、updated、destroyed。钩子的 this 指向<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>它的 Vue 实例。</p> <p>不要在选项<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>或回调上使用箭头<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>,比如 created: () => console.log(this.a) 或 vm.$watch('a',newValue => this.myMethod())。因为箭头<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>是和父级上下文绑定在一起的,this 不会是如你所预期的 Vue 实例,经常导致 Uncaught TypeError: Cannot read property of undefined 或 Uncaught TypeError: this.myMethod is not a function 之类的<a href="https://www.jb51.cc/tag/cuowu/" target="_blank" class="keywords">错误</a>。</p> <p>2.2、生命周期图示</p> <p>下图说明了实例的生命周期。你不需要立马弄明白所有的东西,不过随着你的不断学习和使用,它的参考价值会越来越高。</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300141.jpg" /></p></p> <p><a href="https://www.jb51.cc/tag/zhongwen/" target="_blank" class="keywords">中文</a>版:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300142.jpg" /></p></p> <p>1. beforeCreate</p> <p>在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>。</p> <p>2. created</p> <p>实例已经创建完成之后被<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>。在这一步,实例已完成以下的配置:数据观测(data observer),<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>和<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>的运算, watch/event 事件回调。然而,挂载阶段还没开始,$el <a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>目前不可见。 可以在组件的这个期间请求数据,如果是keep-alive组件会被缓存起来,生命周期不会再次触发,如果需要更新数据可以watch当前router变化,如果router是当前组件所在的router则请求数据。</p> <div class="jb51code"> <pre class="brush:js;"> methods : { getData : function(id){ ... this.content = 'test'; } },created : function(){ this.getData(this.id); } ... watch : { $route : function(){ if(this.$route.name == 'xxx'){ this.getData(this.id); } } }</pre> </div> <p>3. beforeMount</p> <p>在挂载开始之前被<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>:相关的 render <a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>首次被<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>。</p> <p>4. mounted</p> <p>vm.$el已挂载在文档内,对已有dom节点的操作可以在这期间进行。</p> <p>5. beforeUpdate</p> <p>数据更新时<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>,发生在虚拟 DOM 重新渲染和打补丁之前。</p> <p>可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。</p> <p>6.updated</p> <p>由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>该钩子。</p> <p>当这个钩子被<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环。</p> <p>7.activated</p> <p>keep-alive 组件激活时<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>。</p> <p>8.deactivated</p> <p>keep-alive 组件停用时<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>。</p> <p>9.beforeDestroy</p> <p>实例销毁之前<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>。在这一步,实例仍然完全可用。</p> <p>10.destroyed</p> <p>Vue 实例销毁后<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>。<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。</p> <p>2.3、生命周期示例一</p> <p>示例1:</p> <div class="jb51code"> <pre class="brush:js;"> <!DOCTYPE html> <html> <head> <<a href="https://www.jb51.cc/tag/Meta/" target="_blank" class="keywords">Meta</a> charset="UTF-8"> <title>vue2生命周期@H_<a href="https://www.jb51.cc/tag/404/" target="_blank" class="keywords">404</a>_49@ </head> <body> <div id="app1"> <input v-model="msg" /> {{msg}} </div> <button type="button" onclick="destroy()">销毁</button> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> //格式化<a href="https://www.jb51.cc/tag/shuchu/" target="_blank" class="keywords">输出</a> console.log("示例:%c%s","background:red;color:#fff","vue2生命周期","开始了"); <p>var app1 = new Vue({<br /> el: "#app1",beforeCreate:function(){<br /> console.log("创建前:"+this.msg);<br /> },created:function(){<br /> console.log("创建后:"+this.msg+","+this.$el);<br /> },beforeMount:function(){<br /> console.log("挂载前:");<br /> console.log(this.$el);<br /> },mounted:function(){<br /> console.log("挂载后:");<br /> console.log(this.$el);<br /> },beforeUpdate:function(){<br /> console.log("实例更新前:");<br /> console.log(this.msg);<br /> console.log(this.$el);<br /> },updated:function(){<br /> console.log("实例更新后:");<br /> console.log(this.msg);<br /> console.log(this.$el);<br /> },beforeDestroy:function(){<br /> console.log("实例销毁前:");<br /> console.log(this.msg);<br /> },destroyed:function(){<br /> console.log("实例销毁后:");<br /> console.log(this.msg);<br /> }<br /> });</p> <p>function destroy(){<br /> app1.$destroy();<br /> }</p> </script> </body> </html></pre> </div> <p>初始化结果1:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300143.png" /></p></p> <p><a href="https://www.jb51.cc/tag/xiugai/" target="_blank" class="keywords">修改</a>msg的值为vue2后的结果:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300144.png" /></p></p> <p>执行销毁:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300145.png" /></p></p> <p>2.4、生命周期示例二</p> <p>示例2:</p> <div class="jb51code"> <pre class="brush:js;"> <!DOCTYPE html> <html> <head> <title>Vue2生命周期@H_<a href="https://www.jb51.cc/tag/404/" target="_blank" class="keywords">404</a>_49@ </head> <body> <div id="app">{{ message }}</div> <script type="text/javascript" src="https://cdn.jsdelivr.net/vue/2.1.3/vue.js"></script> <script type="text/javascript"> var app = new Vue({ el: '#app',data: { message: "South IT College!" },beforeCreate: function() { console.group('beforeCreate 创建前状态===============》'); console.log("%c%s","color:red","el : " + this.$el); //undefined console.log("%c%s","data : " + this.$data); //undefined console.log("%c%s","message: " + this.message) },created: function() { console.group('created 创建完毕状态===============》'); console.log("%c%s","data : " + this.$data); //已被初始化 console.log("%c%s","message: " + this.message); //已被初始化 },beforeMount: function() { console.group('beforeMount 挂载前状态===============》'); console.log("%c%s","el : " + (this.$el)); //已被初始化 console.log(this.$el); console.log("%c%s","message: " + this.message); //已被初始化 },mounted: function() { console.group('mounted 挂载结束状态===============》'); console.log("%c%s","el : " + this.$el); //已被初始化 console.log(this.$el); console.log("%c%s","data : " + this.$data); //已被初始化 console.log("%c%s",beforeUpdate: function() { console.group('beforeUpdate 更新前状态===============》'); console.log("%c%s","el : " + this.$el); console.log(this.$el); console.log("%c%s","data : " + this.$data); console.log("%c%s","message: " + this.message); },updated: function() { console.group('updated 更新完成状态===============》'); console.log("%c%s",beforeDestroy: function() { console.group('beforeDestroy 销毁前状态===============》'); console.log("%c%s",destroyed: function() { console.group('destroyed 销毁完成状态===============》'); console.log("%c%s","message: " + this.message) } }) </script> </body> </html></pre> </div> <p>初始化结果:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300146.jpg" /></p></p> <p>更新message的值:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300147.jpg" /></p></p> <p>手动销毁实例:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300148.png" /></p></p> <p>2.5、手动挂载与<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>事件 2.5.1、手动挂载</p> <p><code>vm.$mount( [elementOrSelector] ) </code>如果 Vue 实例在实例化时没有收到 el 选项,则它处于“未挂载”状态,没有关联的 DOM 元素。可以使用 vm.$mount() 手动地挂载一个未挂载的实例。</p> <p>如果没有提供 elementOrSelector 参数,模板将被渲染为文档之外的的元素,并且你必须使用原生 DOM API 把它插入文档中。</p> <p>这个<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>返回实例自身,因而可以链式<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>其它实例<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>。</p> <div class="jb51code"> <pre class="brush:js;"> var MyComponent = Vue.extend({ template: '@H_<a href="https://www.jb51.cc/tag/404/" target="_blank" class="keywords">404</a>_468@Hello!</div>' }) // 创建并挂载到 #app (会替换 #app) new MyComponent().$mount('#app') // 同上 new MyComponent({ el: '#app' }) // 或者,在文档之外渲染并且随后挂载 var component = new MyComponent().$mount() document.getElementById('app').appendChild(component.$el)</pre> </div> <p>示例:</p> <div class="jb51code"> <pre class="brush:js;"> <!DOCTYPE html> <html> <head> <<a href="https://www.jb51.cc/tag/Meta/" target="_blank" class="keywords">Meta</a> charset="UTF-8"> <title>vue2生命周期@H_<a href="https://www.jb51.cc/tag/404/" target="_blank" class="keywords">404</a>_49@ <style> #app1 { color: red; } #app2 { color: blue; } </style> </head> <body> <div id="app1"> </div> <div id="app2"> </div> <button type="button" onclick="loaddata1()">手动挂载1</button> <button type="button" onclick="loaddata2()">手动挂载2</button> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var app1 = new Vue({ template: "<h2>{{msg}}</h2>",data: { msg: "Hello Vue2!" } }); function loaddata1() { app1.$mount("#app1"); document.getElementById("app1").appendChild(app1.$el); } function loaddata2() { app1.$mount(); document.getElementById("app2").appendChild(app1.$el); } </script> </body> </html></pre> </div> <p>结果:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300149.png" /></p></p> <p>2.5.2、销毁实例</p> <p>vm.$destroy() 完全销毁一个实例。清理它与其它实例的连接,解绑它的全部指令及事件监听器。</p> <p>2.5.3、强制更新</p> <p>vm.$forceUpdate() 迫使 Vue 实例重新渲染。注意它仅仅影响实例本身和插入插槽<a href="https://www.jb51.cc/tag/neirong/" target="_blank" class="keywords">内容</a>的子组件,而不是所有子组件。</p> <p style="text-align: center"><p class="pic_center">@H_<a href="https://www.jb51.cc/tag/502/" target="_blank" class="keywords">502</a>_510@</p></p> <p><h3>三、Vue脚手架(vue-cli)</h3></p> <p>单页Web应用(single page web application,SPA),就是只有一张Web<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>的应用,是加载单个HTML <a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>并在<a href="https://www.jb51.cc/tag/yonghu/" target="_blank" class="keywords">用户</a>与应用程序交互时动态更新该<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>的Web应用程序。</p> <p>提供一个官方命令行工具,可用于<a href="https://www.jb51.cc/tag/kuaisu/" target="_blank" class="keywords">快速</a>搭建大型单页应用(SPA)。该工具为现代化的前端开发工作流提供了开箱即用的构建配置。只需几分钟即可创建并启动一个带热重载、保存时静态检查以及可用于生产环境的构建配置的项目:</p> <div class="jb51code"> <pre class="brush:js;"> # 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 webpack 模板的新项目 $ vue init webpack my-project # 安装依赖,走你 $ cd my-project $ npm install $ npm run dev</pre> </div> <p>注意:CLI 工具假定<a href="https://www.jb51.cc/tag/yonghu/" target="_blank" class="keywords">用户</a>对 Node.js 和相关构建工具有一定程度的了解。如果你是新手,我们强烈建议先在不用构建工具的情况下通读指南,在熟悉 Vue 本身之后再使用 CLI。</p> <p>3.1、环境搭建 3.1.1、安装node.js</p> <p>从n ode.js官网 下载并安装node,安装过程很简单,一路“下一步”就可以了。安装完成之后,打开命令行工具(win+r,然后输入cmd),输入 node -v,如下图,如果出现相应的版本号,则说明安装成功。</p> <p><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300151.png" /></p></p> <p>如果安装不成功,可以直接把安装包<a href="https://www.jb51.cc/tag/xiugai/" target="_blank" class="keywords">修改</a>成压缩包,解压后配置环境变量也可以,就成了绿色版。</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300152.jpg" /></p></p> <p>这里需要说明下,因为在官网下载安装node.js后,就已经<a href="https://www.jb51.cc/tag/zidai/" target="_blank" class="keywords">自带</a>npm(包管理工具)了,另需要注意的是npm的版本最好是3.x.x以上,以免对后续产生影响。</p> <p>注意版本不能太低,如果您已经安装了低版本的node可以使用npm直接更新。</p> <p>3.1.2、<a href="https://www.jb51.cc/tag/xiugai/" target="_blank" class="keywords">修改</a>npm为淘宝镜像</p> <p>因为npm的仓库有许多在国外,访问的速度较慢,建议<a href="https://www.jb51.cc/tag/xiugai/" target="_blank" class="keywords">修改</a>成cnpm,换成taobao的镜像。</p> <p>打开命令行工具,复制如下配置:</p> <div class="jb51code"> <pre class="brush:js;"> npm install -g cnpm --registry=https://registry.npm.taobao.org</pre> </div> <p>安装这里是因为我们用的npm的服务器是外国,有的时候我们安装“依赖”的时候很很慢很慢超级慢,所以就用这个cnpm来安装我们说需要的“依赖”。安装完成之后输入 cnpm -v,如下图,如果出现相应的版本号,则说明安装成功。</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300153.png" /></p></p> <p>版本号:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300254.png" /></p></p> <p>3.1.3、安装webpack</p> <p>安装webpack,打开命令行工具输入:</p> <div class="jb51code"> <pre class="brush:js;"> npm install webpack -g</pre> </div> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300255.jpg" /></p></p> <p>安装完成之后输入</p> <div class="jb51code"> <pre class="brush:js;"> webpack -v</pre> </div> <p>如下图,如果出现相应的版本号,则说明安装成功。</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300256.png" /></p></p> <p>3.1.4、安装vue-cli脚手架构建工具</p> <p>打开命令行工具输入:</p> <div class="jb51code"> <pre class="brush:js;"> cnpm install vue-cli -g</pre> </div> <p>安装完成之后输入 vue -V(注意这里是大写的“V”),如下图,如果出现相应的版本号,则说明安装成功。</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300257.png" /></p></p> <p>3.2、构建项目</p> <p>1)、在硬盘上找一个<a href="https://www.jb51.cc/tag/wenjian/" target="_blank" class="keywords">文件</a>夹放工程用的。这里有两种方式指定到相关目录:</p> <p>①cd 目录路径</p> <p>②如果以安装git的,在相关目录右键选择Git Bash Here</p> <p>2)、安装vue脚手架输入:vue init webpack projectName,注意这里的“projectName” 是项目的<a href="https://www.jb51.cc/tag/mingcheng/" target="_blank" class="keywords">名称</a>可以说是随便的起名,但是“ 不能用<a href="https://www.jb51.cc/tag/zhongwen/" target="_blank" class="keywords">中文</a> ”。</p> <p><a href="https://www.jb51.cc/tag/tishi/" target="_blank" class="keywords">提示</a>选择项:</p> <div class="jb51code"> <pre class="brush:js;"> $ vue init webpack exprice --------------------- 这个是那个安装vue脚手架的命令 This will install Vue 2.x version of the template. ---------------------这里说明将要创建一个vue 2.x版本的项目 For Vue 1.x use: vue init webpack#1.0 exprice ? Project name (exprice) ---------------------项目<a href="https://www.jb51.cc/tag/mingcheng/" target="_blank" class="keywords">名称</a> ? Project name exprice ? Project description (A Vue.js project) ---------------------项目描述 ? Project description A Vue.js project ? Author Datura --------------------- 项目创建者 ? Author Datura ? Vue build (Use arrow keys) ? Vue build standalone ? Install vue-router? (Y/n) --------------------- 是否安装Vue路由,也就是以后是spa(但<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>应用需要的模块) ? Install vue-router? Yes ? Use ESLint to lint your code? (Y/n) n ---------------------是否启用eslint检测规则,这里个人建议选no ? Use ESLint to lint your code? No ? Setup unit tests with Karma + Mocha? (Y/n) ? Setup unit tests with Karma + Mocha? Yes ? Setup e2e tests with Nightwatch? (Y/n) ? Setup e2e tests with Nightwatch? Yes vue-cli · Generated "exprice". To get started: --------------------- 这里说明如何启动这个服务 cd exprice npm install npm run dev</pre> </div> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300258.jpg" /></p></p> <p>3)、cd 命令进入创建的工程目录,首先cd projectName;</p> <p>4)、安装项目依赖:npm install,因为<a href="https://www.jb51.cc/tag/zidong/" target="_blank" class="keywords">自动</a>构建过程中已存在package.json<a href="https://www.jb51.cc/tag/wenjian/" target="_blank" class="keywords">文件</a>,所以这里直接安装依赖就行。不要从国内镜像cnpm安装(会导致后面缺了很多依赖库),但是但是如果真的安装“个把”小时也没成功那就用:cnpm install 吧</p> <p>5)、安装 vue 路由模块 vue-router 和网络请求模块 vue-resource,输入:cnpm install vue-router vue-resource --save。</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300259.png" /></p></p> <p>目录:</p> <div class="jb51code"> <pre class="brush:js;"> |-- build // 项目构建(webpack)相关<a href="https://www.jb51.cc/tag/daima/" target="_blank" class="keywords">代码</a> | |-- build.js // 生产环境构建<a href="https://www.jb51.cc/tag/daima/" target="_blank" class="keywords">代码</a> | |-- check-version.js // 检查node、npm等版本 | |-- dev-client.js // 热重载相关 | |-- dev-server.js // 构建本地服务器 | |-- utils.js // 构建工具相关 | |-- webpack.base.conf.js // webpack基础配置 | |-- webpack.dev.conf.js // webpack开发环境配置 | |-- webpack.prod.conf.js // webpack生产环境配置 |-- config // 项目开发环境配置 | |-- dev.env.js // 开发环境变量 | |-- index.js // 项目一些配置变量 | |-- prod.env.js // 生产环境变量 | |-- test.env.js // 测试环境变量 |-- src // 源码目录 | |-- components // vue公共组件 | |-- store // vuex的状态管理 | |-- App.vue // <a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>入口<a href="https://www.jb51.cc/tag/wenjian/" target="_blank" class="keywords">文件</a> | |-- main.js // 程序入口<a href="https://www.jb51.cc/tag/wenjian/" target="_blank" class="keywords">文件</a>,加载各种公共组件 |-- static // <a href="https://www.jb51.cc/tag/jingtaiwenjian/" target="_blank" class="keywords">静态文件</a>,比如一些<a href="https://www.jb51.cc/tag/tupian/" target="_blank" class="keywords">图片</a>,json数据等 | |-- data // 群聊分析得到的数据用于数据可视化 |-- .babelrc // ES6语法编译配置 |-- .editorconfig // 定义<a href="https://www.jb51.cc/tag/daima/" target="_blank" class="keywords">代码</a>格式 |-- .gitignore // git<a href="https://www.jb51.cc/tag/shangchuan/" target="_blank" class="keywords">上传</a>需要忽略的<a href="https://www.jb51.cc/tag/wenjian/" target="_blank" class="keywords">文件</a>格式 |-- README.md // 项目说明 |-- favicon.ico |-- index.html // 入口<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a> |-- package.json // 项目基本信息</pre> </div> <p>3.3、运行项目</p> <p>6)、启动项目,输入:npm run dev。服务启动成功后浏览器会默认打开一个“欢迎<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>”,如下图:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300260.jpg" /></p></p> <p>编译成功后可以直接在浏览器中查看项目:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300261.png" /></p></p> <p>3.4、Vue-cli HelloWorld</p> <p>了解了默认的模板<a href="https://www.jb51.cc/tag/neirong/" target="_blank" class="keywords">内容</a>,我们可以开始定义自己的vue程序了,这里写一个简单的HelloWorld,在src目录下创建一个Hi.vue<a href="https://www.jb51.cc/tag/wenjian/" target="_blank" class="keywords">文件</a>,<a href="https://www.jb51.cc/tag/neirong/" target="_blank" class="keywords">内容</a>如下:</p> <div class="jb51code"> <pre class="brush:js;"> <template> <div id="app1"> <input v-model="msg" v-on:click="sayhi"/> <p> <h2>{{msg}}</h2> </p> </div> </template> <script> export default { name: 'Hi',data() { return { msg: 'My First vue-cli app!' } },methods:{ sayhi:function(){ alert(this.msg); } } } </script> <style> #app1 { font-family: "microsoft yahei"; color: dodgerblue; font-size: 20px; } </style></pre> </div> <p><a href="https://www.jb51.cc/tag/xiugai/" target="_blank" class="keywords">修改</a>main.js</p> <div class="jb51code"> <pre class="brush:js;"> // The Vue build version to load with the `import` command // (runtime-only or standalone) has been set in webpack.base.conf with an alias. import Vue from 'vue' import App from './Hi' <p>Vue.config.productionTip = false</p> <p>/<em> eslint-disable no-new </em>/<br /> new Vue({<br /> el: '#app',template: '<App/>',components: { App }<br /> })</pre></p> </div> <p>运行结果:</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300262.png" /></p></p> <p><h3>四、示例下载</h3></p> <p><a href="https://git.coding.net/zhangguo5/vue2.git">https://git.coding.net/zhangguo5/vue2.git</a></p> <p><h3>五、视频</h3></p> <p><a href="https://www.bilibili.com/video/av17503637/">https://www.bilibili.com/video/av17503637/</a></p> <p><h3>六、作业</h3></p> <p>1、请定义任意一个Vue实例,触发Vue实例中的8个事件,将结果<a href="https://www.jb51.cc/tag/shuchu/" target="_blank" class="keywords">输出</a>到控制台,要求可以观察到数据初始化与挂载情况。</p> <p>2、请使用vue2+bootstrap完成如下<a href="https://www.jb51.cc/tag/gongneng/" target="_blank" class="keywords">功能</a>:</p> <p>要求如下:</p> <p>a)、实现<a href="https://www.jb51.cc/tag/tianjia/" target="_blank" class="keywords">添加</a><a href="https://www.jb51.cc/tag/gongneng/" target="_blank" class="keywords">功能</a></p> <p>b)、实现<a href="https://www.jb51.cc/tag/shanchu/" target="_blank" class="keywords">删除</a><a href="https://www.jb51.cc/tag/gongneng/" target="_blank" class="keywords">功能</a></p> <p>c)、实现编辑<a href="https://www.jb51.cc/tag/gongneng/" target="_blank" class="keywords">功能</a>,<a href="https://www.jb51.cc/tag/zengjia/" target="_blank" class="keywords">增加</a>按钮</p> <p>d)、实现隔行换色</p> <p>e)、实现按年龄排序</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300263.gif" /></p></p> <p>参考 :</p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300264.gif" /></p></p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300265.gif" /></p></p> <p style="text-align: center"><p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300266.png" /></p> <p class="pic_center"><img src="https://files.jb51.cc/file_images/article/201712/2017122713300367.gif" /></p></p> <p><h3>总结</h3></p> <p>以上所述是小编给大家介绍的Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解。编程之家 jb51.cc 收集整理的教程希望能对你有所帮助,如果觉得编程之家不错,可<a href="https://www.jb51.cc/tag/fenxiang/" target="_blank" class="keywords">分享</a>给好友!感谢<a href="https://www.jb51.cc/tag/zhichi/" target="_blank" class="keywords">支持</a>。</p><i class="glyphicon glyphicon-link"></i> 原文链接:https://www.f2er.com/vue/34457.html</div> <div class="topcard-tags"><a href="https://www.f2er.com/tag/cli/" class="tag_link" target="_blank">cli</a><a href="https://www.f2er.com/tag/clip/" class="tag_link" target="_blank">cli</a><a href="https://www.f2er.com/tag/pcli/" class="tag_link" target="_blank">cli</a><a href="https://www.f2er.com/tag/vue/" class="tag_link" target="_blank">vue</a><a href="https://www.f2er.com/tag/pvue/" class="tag_link" target="_blank">vue</a><a href="https://www.f2er.com/tag/vuep/" class="tag_link" target="_blank">vue</a><a href="https://www.f2er.com/tag/shili/" class="tag_link" target="_blank">实例</a><a href="https://www.f2er.com/tag/shilip/" class="tag_link" target="_blank">实例</a><a href="https://www.f2er.com/tag/pshili/" class="tag_link" target="_blank">实例</a><a href="https://www.f2er.com/tag/shengmingzhouqi/" class="tag_link" target="_blank">生命周期</a><a href="https://www.f2er.com/tag/shengmingzhouqip/" class="tag_link" target="_blank">生命周期</a><a href="https://www.f2er.com/tag/jiaoshoujia/" class="tag_link" target="_blank">脚手架</a><a href="https://www.f2er.com/tag/jiaoshoujiap/" class="tag_link" target="_blank">脚手架</a></div> <ul class="list-group"> <li class="list-group-item"><a href="https://www.f2er.com/vue/34464.html" title="简单的Vue异步组件实例Demo">上一篇:简单的Vue异步组件实例Demo</a><a href="https://www.f2er.com/vue/34453.html" title="webpack搭建vue 项目的步骤" class="text-muted pull-right">下一篇:webpack搭建vue 项目的步骤</a> </li> </ul> </div> </div> </div> <!-- row end --> <div class="row row-sm"> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-4605373693034661" data-ad-slot="9144498553"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script></div> </div> </div> <div class="row row-sm"> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <div class="title"><h1>猜你在找的Vue相关文章</h1></div> <div class="list_con"> <a href="https://www.f2er.com/vue/997429.html" title="elementui的el-tree第一次加载无法展开和选中的问题"><div class="title">elementui的el-tree第一次加载无法展开和选中的问题</div> <div class="summary">问题现象 elmentui的el-tree数据加载问题,导致第一次加载选中当前节点和高亮当前节点没有...</div> <time class="summary">作者:前端之家 时间:2021-02-17</time> </a> </div> <div class="list_con"> <a href="https://www.f2er.com/vue/997428.html" title="VSCODE打开一个文件,另一个文件就关闭的问题的解决方法"><img class="lazy" src="https://www.f2er.com/images/np.jpg" data-original="https://www.f2er.com/res/2021/02-17/21/9e2e32f4ad7f00fdffa540c0f7d918e1.png" title="" width="160" height="90" style="float:right;margin-left:30px;display:none;" /><div class="title">VSCODE打开一个文件,另一个文件就关闭的问题的解决方法</div> <div class="summary">因为刚打开文件,vscode默认是预览状态,如果编辑过之后,就不会有这个问题。 可以通过双击...</div> <time class="summary">作者:前端之家 时间:2021-02-17</time> </a> </div> <div class="list_con"> <a href="https://www.f2er.com/vue/997427.html" title="一文带你学会国产加密算法SM4的vue实现方案"><img class="lazy" src="https://www.f2er.com/images/np.jpg" data-original="https://www.f2er.com/res/2021/02-17/21/29a0275a80b1fac147aa687624a9bfe1.png" title="" width="160" height="90" style="float:right;margin-left:30px;display:none;" /><div class="title">一文带你学会国产加密算法SM4的vue实现方案</div> <div class="summary">前言 上篇文章我们介绍了国产SM4加密算法的后端java实现方案。没有看过的小伙伴可以看一下...</div> <time class="summary">作者:前端之家 时间:2021-02-17</time> </a> </div> <div class="list_con"> <a href="https://www.f2er.com/vue/997426.html" title="解决vue报错:Module build failed (from ./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js): TypeError: Cannot read property 'range' of null"><img class="lazy" src="https://www.f2er.com/images/np.jpg" data-original="https://www.f2er.com/res/2021/02-17/21/ac433ae643be89ef37b127b24fa2a61a.png" title="" width="160" height="90" style="float:right;margin-left:30px;display:none;" /><div class="title">解决vue报错:Module build failed (from ./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js): TypeError: Cannot read property 'range' of null</div> <div class="summary">在项目中引入动态路由时报错 写法: 报错: Module build failed (from ./node_modules/_esl...</div> <time class="summary">作者:前端之家 时间:2021-02-17</time> </a> </div> <div class="list_con"> <a href="https://www.f2er.com/vue/997425.html" title="vue中解决Uncaught ReferenceError: regeneratorRuntime is not defined问题"><img class="lazy" src="https://www.f2er.com/images/np.jpg" data-original="https://www.f2er.com/res/2021/02-17/21/9f2045768979b899c69e66354a1f62d0.png" title="" width="160" height="90" style="float:right;margin-left:30px;display:none;" /><div class="title">vue中解决Uncaught ReferenceError: regeneratorRuntime is not defined问题</div> <div class="summary">问题产生 在使用babel编译es6时,遇到报错Uncaught ReferenceError: regeneratorRuntime i...</div> <time class="summary">作者:前端之家 时间:2021-02-17</time> </a> </div> <div style="border-bottom: 1px solid #f4f4f4;margin-top:20px;"> <ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="-fr-2o+fp-dx-wx" data-ad-client="ca-pub-4605373693034661" data-ad-slot="4561116489"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div><div class="list_con"> <a href="https://www.f2er.com/vue/997423.html" title="element-UI中手动调用table排序"><div class="title">element-UI中手动调用table排序</div> <div class="summary">&amp;lt;el-table :data=&amp;quot;tableData&amp;quot; &amp;quot;width...</div> <time class="summary">作者:前端之家 时间:2021-02-17</time> </a> </div> <div class="list_con"> <a href="https://www.f2er.com/vue/994895.html" title="Vue双向绑定原理及其实现"><img class="lazy" src="https://www.f2er.com/images/np.jpg" data-original="https://www.f2er.com/res/2021/01-10/13/13055abb3c90b13ed50222b980d4a858.gif" title="" width="160" height="90" style="float:right;margin-left:30px;display:none;" /><div class="title">Vue双向绑定原理及其实现</div> <div class="summary">在之前面试的时候被面试官问到是否了解Vue双向绑定的原理,其实自己之前看过双向绑定的原理...</div> <time class="summary">作者:前端之家 时间:2021-01-10</time> </a> </div> <div class="list_con"> <a href="https://www.f2er.com/vue/994894.html" title="Vue事件修饰符详解"><img class="lazy" src="https://www.f2er.com/images/np.jpg" data-original="https://www.f2er.com/res/2021/01-10/13/b4cf1534468c90981806f6f883c8e876.png" title="" width="160" height="90" style="float:right;margin-left:30px;display:none;" /><div class="title">Vue事件修饰符详解</div> <div class="summary">整体学习Vue时看到Vue文档中有事件修饰符的描述,但是看了之后并没有理解是什么意思,于是...</div> <time class="summary">作者:前端之家 时间:2021-01-10</time> </a> </div> <div class="list_con"> <a href="https://www.f2er.com/vue/994741.html" title="Vue-router插件使用"><img class="lazy" src="https://www.f2er.com/images/np.jpg" data-original="https://www.f2er.com/res/2021/01-01/21/bf84b4bbaaac53ea67ceec4898781512.png" title="" width="160" height="90" style="float:right;margin-left:30px;display:none;" /><div class="title">Vue-router插件使用</div> <div class="summary">单页面原理 Vue是单页面开发,即页面不刷新。 页面不刷新,而又要根据用户选择完成内容的更...</div> <time class="summary">作者:前端之家 时间:2021-01-01</time> </a> </div> <div class="list_con"> <a href="https://www.f2er.com/vue/994740.html" title="Vue 分支循环"><img class="lazy" src="https://www.f2er.com/images/np.jpg" data-original="https://www.f2er.com/res/2021/01-01/21/ed0d5c51fe9891d0c42f795f23333ec1.png" title="" width="160" height="90" style="float:right;margin-left:30px;display:none;" /><div class="title">Vue 分支循环</div> <div class="summary">v-for 通过v-for进行循环,不光可以拿到元素本身,也可以拿到索引值。 如果数据是对象类型...</div> <time class="summary">作者:前端之家 时间:2021-01-01</time> </a> </div> <div style="border-bottom: 1px solid #f4f4f4;margin-top:20px;"> <ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="-fr-2o+fp-dx-wx" data-ad-client="ca-pub-4605373693034661" data-ad-slot="4561116489"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div></div> </div> </div> </div> <!-- left end--> <!-- right --> <div class="col-sm-12 col-md-12 col-lg-3"> <!-- row --> <div class="row row-sm"> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <label class="main-content-label ">编程分类</label> <div class="cate mt-20"><a href="https://www.f2er.com/html/" title="HTML">HTML</a><a href="https://www.f2er.com/html5/" title="HTML5">HTML5</a><a href="https://www.f2er.com/js/" title="JavaScript">JavaScript</a><a href="https://www.f2er.com/css/" title="CSS">CSS</a><a href="https://www.f2er.com/jquery/" title="jQuery">jQuery</a><a href="https://www.f2er.com/bootstrap/" title="Bootstrap">Bootstrap</a><a href="https://www.f2er.com/angularjs/" title="Angularjs">Angularjs</a><a href="https://www.f2er.com/typescript/" title="TypeScript">TypeScript</a><a href="https://www.f2er.com/vue/" title="Vue">Vue</a><a href="https://www.f2er.com/dojo/" title="Dojo">Dojo</a><a href="https://www.f2er.com/json/" title="Json">Json</a><a href="https://www.f2er.com/electron/" title="Electron">Electron</a><a href="https://www.f2er.com/nodejs/" title="Node.js">Node.js</a><a href="https://www.f2er.com/extjs/" title="extjs">extjs</a><a href="https://www.f2er.com/express/" title="Express ">Express </a><a href="https://www.f2er.com/xml/" title="XML">XML</a><a href="https://www.f2er.com/es6/" title="ES6">ES6</a><a href="https://www.f2er.com/ajax/" title="Ajax">Ajax</a><a href="https://www.f2er.com/flash/" title="Flash">Flash</a><a href="https://www.f2er.com/unity/" title="Unity">Unity</a><a href="https://www.f2er.com/react/" title="React">React</a><a href="https://www.f2er.com/flex/" title="Flex">Flex</a><a href="https://www.f2er.com/antdesign/" title="Ant Design">Ant Design</a><a href="https://www.f2er.com/webfrontend/" title="Web前端">Web前端</a><a href="https://www.f2er.com/weapp/" title="微信小程序">微信小程序</a><a href="https://www.f2er.com/wxmp/" title="微信公众号">微信公众号</a><div class="clearfix"></div> </div> </div> </div> </div> <!-- row end --> <!-- row --> <div class="row row-sm"> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <!-- f2er-rightads --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-4605373693034661" data-ad-slot="7756441254" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> </div> <!-- row end --> <!-- row --> <div class="row row-sm"> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <label class="main-content-label ">最新文章</label> <ul class="n-list"><li><a href="https://www.f2er.com/vue/997429.html" title="elementui的el-tree第一次加载无法展开和选中的问题" target="_blank">• elementui的el-tree第一次</a></li> <li><a href="https://www.f2er.com/vue/997428.html" title="VSCODE打开一个文件,另一个文件就关闭的问题的解决方法" target="_blank">• VSCODE打开一个文件,另一</a></li> <li><a href="https://www.f2er.com/vue/997427.html" title="一文带你学会国产加密算法SM4的vue实现方案" target="_blank">• 一文带你学会国产加密算法</a></li> <li><a href="https://www.f2er.com/vue/997426.html" title="解决vue报错:Module build failed (from ./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js): TypeError: Cannot read property 'range' of null" target="_blank">• 解决vue报错:Module buil</a></li> <li><a href="https://www.f2er.com/vue/997425.html" title="vue中解决Uncaught ReferenceError: regeneratorRuntime is not defined问题" target="_blank">• vue中解决Uncaught Refere</a></li> <li><a href="https://www.f2er.com/vue/997424.html" title="vue的自定义组件如何使用prop传值?" target="_blank">• vue的自定义组件如何使用p</a></li> <li><a href="https://www.f2er.com/vue/997423.html" title="element-UI中手动调用table排序" target="_blank">• element-UI中手动调用tabl</a></li> <li><a href="https://www.f2er.com/vue/994895.html" title="Vue双向绑定原理及其实现" target="_blank">• Vue双向绑定原理及其实现</a></li> <li><a href="https://www.f2er.com/vue/994894.html" title="Vue事件修饰符详解" target="_blank">• Vue事件修饰符详解</a></li> <li><a href="https://www.f2er.com/vue/994741.html" title="Vue-router插件使用" target="_blank">• Vue-router插件使用</a></li> </ul> </div> </div> </div> <!-- row end --> <!-- row --> <div class="row row-sm"> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <label class="main-content-label ">热门标签 <span class="pull-right tx-12"> <a href="https://www.f2er.com/all" target="_blank">更多 ►</a></span> </label> <div class="topcard-tags"><a href="https://www.f2er.com/tag/guanbiyangao/" title="关闭广告" target="_blank">关闭广告</a><a href="https://www.f2er.com/tag/danduheaders/" title="单独headers" target="_blank">单独headers</a><a href="https://www.f2er.com/tag/fengzhuangdaima/" title="封装代码" target="_blank">封装代码</a><a href="https://www.f2er.com/tag/tishicuowu/" title="提示错误" target="_blank">提示错误</a><a href="https://www.f2er.com/tag/zhengshuzhengze/" title="整数正则" target="_blank">整数正则</a><a href="https://www.f2er.com/tag/fei0kaitou/" title="非0开头" target="_blank">非0开头</a><a href="https://www.f2er.com/tag/tiaoye/" title="跳页" target="_blank">跳页</a><a href="https://www.f2er.com/tag/chuyema/" title="出页码" target="_blank">出页码</a><a href="https://www.f2er.com/tag/antdtable/" title="antd table" target="_blank">antd table</a><a href="https://www.f2er.com/tag/tishiURLweizhuce/" title="提示URL未注册" target="_blank">提示URL未注册</a><a href="https://www.f2er.com/tag/gongzhonghaozhifu/" title="公众号支付" target="_blank">公众号支付</a><a href="https://www.f2er.com/tag/vuehashmoshi/" title="vue hash模式" target="_blank">vue hash模式</a><a href="https://www.f2er.com/tag/iSlider/" title="iSlider" target="_blank">iSlider</a><a href="https://www.f2er.com/tag/chepaijianpan/" title="车牌键盘" target="_blank">车牌键盘</a><a href="https://www.f2er.com/tag/xunhuantupian/" title="循环图片" target="_blank">循环图片</a><a href="https://www.f2er.com/tag/echartsshuangzhexian/" title="echarts 双折线" target="_blank">echarts 双折</a><a href="https://www.f2er.com/tag/zuoyoubuju/" title="左右布局" target="_blank">左右布局</a><a href="https://www.f2er.com/tag/DllPlugin/" title="DllPlugin" target="_blank">DllPlugin</a><a href="https://www.f2er.com/tag/duixiangchuangjian/" title="对象创建" target="_blank">对象创建</a><a href="https://www.f2er.com/tag/daziyouxi/" title="打字游戏" target="_blank">打字游戏</a><a href="https://www.f2er.com/tag/quanxuan/" title="圈选" target="_blank">圈选</a><a href="https://www.f2er.com/tag/lianglan/" title="两栏" target="_blank">两栏</a><a href="https://www.f2er.com/tag/yunhanshu/" title="云函数" target="_blank">云函数</a><a href="https://www.f2er.com/tag/mengban/" title="蒙版" target="_blank">蒙版</a><a href="https://www.f2er.com/tag/ES2020/" title="ES2020" target="_blank">ES2020</a><a href="https://www.f2er.com/tag/chuchuang/" title="橱窗" target="_blank">橱窗</a><a href="https://www.f2er.com/tag/wufenggundonglunbo/" title="无缝滚动轮播" target="_blank">无缝滚动轮播</a><a href="https://www.f2er.com/tag/sekuaipengzhuang/" title="色块碰撞" target="_blank">色块碰撞</a><a href="https://www.f2er.com/tag/zujianxiaohui/" title="组件销毁" target="_blank">组件销毁</a><a href="https://www.f2er.com/tag/wendangcaozuo/" title="文档操作" target="_blank">文档操作</a></div> </div> </div> </div> <!-- row end --> <!-- row --> <div class="row row-sm"> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <!-- f2er-rightads --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-4605373693034661" data-ad-slot="7756441254" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> </div> <!-- row end --> </div> <!-- right end --> </div> </div> <footer id="footer"> <div class="container"> <div class="row hidden-xs"> <dl class="col-sm-6 site-link"> <dt>最近更新</dt><dd><a href="https://www.f2er.com/faq/884225.html" title="jQuery选择伪元素:after" target="_blank">· jQuery选择伪元素:after</a><span class="text-muted pull-right">10-20</span></dd> <dd><a href="https://www.f2er.com/faq/884224.html" title="JavaScript随机颜色生成器" target="_blank">· JavaScript随机颜色生成器</a><span class="text-muted pull-right">10-20</span></dd> <dd><a href="https://www.f2er.com/faq/884223.html" title="JavaScript指数" target="_blank">· JavaScript指数</a><span class="text-muted pull-right">10-20</span></dd> <dd><a href="https://www.f2er.com/faq/884222.html" title="addResourceHandlers无法解析静态资源" target="_blank">· addResourceHandlers无法解析静态资源</a><span class="text-muted pull-right">10-20</span></dd> <dd><a href="https://www.f2er.com/faq/884221.html" title="如何将字节数组转换为MultipartFile" target="_blank">· 如何将字节数组转换为MultipartFile</a><span class="text-muted pull-right">10-20</span></dd> <dd><a href="https://www.f2er.com/faq/884220.html" title="在java中如何创建一个文件并写入内容?" target="_blank">· 在java中如何创建一个文件并写入内容?</a><span class="text-muted pull-right">10-20</span></dd> <dd><a href="https://www.f2er.com/faq/884219.html" title="星号*在Python中是什么意思?" target="_blank">· 星号*在Python中是什么意思?</a><span class="text-muted pull-right">10-20</span></dd> <dd><a href="https://www.f2er.com/faq/884218.html" title="Flask框架:MVC模式" target="_blank">· Flask框架:MVC模式</a><span class="text-muted pull-right">10-20</span></dd> <dd><a href="https://www.f2er.com/faq/884217.html" title="在JavaScript对象数组中按ID查找对象" target="_blank">· 在JavaScript对象数组中按ID查找对象</a><span class="text-muted pull-right">10-20</span></dd> <dd><a href="https://www.f2er.com/faq/884216.html" title="使用Javascript / jQuery下载文件" target="_blank">· 使用Javascript / jQuery下载文件</a><span class="text-muted pull-right">10-20</span></dd> </dl> <dl class="col-sm-4 site-link"> <dt>好站推荐</dt><dd> <a href="https://www.runoob.com" title="菜鸟教程(www.runoob.com)提供了编程的基础技术教程, 介绍了HTML、CSS、Javascript、Python,Java,Ruby,C,PHP , MySQL等各种编程语言的基础知识。 同时本站中也提供了大量的在线实例,通过实例,您可以更好的学习编程。" target="_blank">菜鸟教程</a></dd><dd> <a href="https://www.jb51.cc" title="编程之家(www.jb51.cc)是成立于2017年面向全球中文开发者的技术内容分享平台。提供编程导航、编程问答、编程博文、编程百科、编程教程、编程工具、编程实例等开发者最需要的编程技术内容与开发工具支持,与你一起学习编程,相信编程改变未来!" target="_blank">编程之家</a></dd><dd> <a href="https://www.f2er.com" title="前端之家 f2er.com 前端开发人员所需学习知识手册。" target="_blank">前端之家</a></dd></dl> <dl class="col-sm-2 site-link"> <dt>商务合作</dt> <dd><a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=76874919&site=qq&menu=yes">联系我们</a></dd> </dl> </div> <div class="copyright"> Copyright © 2019 前端之家. 当前版本 V7.0.16<br> <span class="ml5">前端之家 版权所有 <a href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">闽ICP备13020303号-10</a></span> </div> </div> </footer> <script type="text/javascript" src="https://www.f2er.com/js/base.js"></script> </body> </html>