vue.js是什么
声明式渲染
Vue.js 的核心是一个允许采用简洁的模板语法来声明式的将数据渲染进 DOM:
<div id="app"> <p>{{message}}</p> //Hello Vue.js! </div> <script src="js/vue.js"></script> <script> new Vue({ el:'#app', data:{ message:'Hello Vue.js!' } }) </script>
现在数据和 DOM 已经被绑定在一起,所有的元素都是响应式的
除了文本插值,我们还可以采用这样的方式绑定 DOM 元素属性:
<div id="appa"> <p>{{message}}</p> <span v-bind:title="message">鼠标悬停几秒钟查看此处动态绑定的提示信息!</span> </div> <script src="js/vue.js"></script> <script> new Vue({ el:'#appa', data:{ message:'Hello Vue.js!' } }) </script>
条件与循环
<div id="appa"> <p>{{message}}</p> <span v-bind:title="message">鼠标悬停几秒钟查看此处动态绑定的提示信息!</span> <p v-if="seen">现在你看到我了</p> </div> <script src="js/vue.js"></script> <script> new Vue({ el:'#appa', data:{ message:'Hello Vue.js!', seen: true } }) </script>
继续在控制台设置 appa.seen = false,你会发现 “现在你看到我了” 消失了
这个例子演示了我们不仅可以绑定 DOM 文本到数据,也可以绑定 DOM 结构到数据。而且,Vue 也提供一个强大的过渡效果系统,可以在 Vue 插入/更新/删除元素时自动应用过渡效果
还有其它很多指令,每个都有特殊的功能。例如,v-for 指令可以绑定数组的数据来渲染一个项目列表:
<div id="appa"> <p>{{message}}</p> <span v-bind:title="message">鼠标悬停几秒钟查看此处动态绑定的提示信息!</span> <p v-if="seen">现在你看到我了</p> <ol> <li v-for="todo in todos">{{ todo.text }}</li> </ol> </div> <script src="js/vue.js"></script> <script> new Vue({ el:'#appa', data:{ message:'Hello Vue.js!', seen: true, todos: [ { text: '学习 JavaScript' }, { text: '学习 Vue' }, { text: '整个牛项目' } ] } }) </script>
处理用户输入
为了让用户和你的应用进行互动,我们可以用 v-on 指令绑定一个事件监听器,通过它调用我们 Vue 实例中定义的方法:
<div id="appa"> <p>{{message}}</p> <span v-bind:title="message">鼠标悬停几秒钟查看此处动态绑定的提示信息!</span> <p v-if="seen">现在你看到我了</p> <ol> <li v-for="todo in todos">{{ todo.text }}</li> </ol> <button v-on:click="reverseMessage">逆转消息</button> </div> <script src="js/vue.js"></script> <script> new Vue({ el:'#appa', data:{ message:'Hello Vue.js!', seen: true, todos: [ { text: '学习 JavaScript' }, { text: '学习 Vue' }, { text: '整个牛项目' } ] }, methods:{ reverseMessage:function(){ this.message = this.message.split('').reverse().join(''); } } }) </script>
注意在 reverseMessage 方法中,我们更新了应用的状态,但没有触碰 DOM —— 所有的 DOM 操作都由 Vue 来处理,我们编写代码只需要关注底层逻辑
Vue 还提供了 v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定
<div id="appa"> <p>{{message}}</p> <span v-bind:title="message">鼠标悬停几秒钟查看此处动态绑定的提示信息!</span> <p v-if="seen">现在你看到我了</p> <ol> <li v-for="todo in todos">{{ todo.text }}</li> </ol> <button v-on:click="reverseMessage">逆转消息</button> <input v-model="message"/> </div> <script src="js/vue.js"></script> <script> new Vue({ el:'#appa', data:{ message:'Hello Vue.js!', seen: true, todos: [ { text: '学习 JavaScript' }, { text: '学习 Vue' }, { text: '整个牛项目' } ] }, methods:{ reverseMessage:function(){ this.message = this.message.split('').reverse().join(''); } } }) </script>
组件化应用构建
组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型、自包含和通常可复用的组件构建大型应用。仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树:
在 Vue 里,一个组件本质上是一个拥有预定义选项的 Vue 实例,在 Vue 中注册组件很简单:
Vue.component('todo-item', { // 定义名为 todo-item 的新组件
template: '<li>这是个待办项</li>' })
<ol>
<todo-item></todo-item> <!-- 创建一个 todo-item 组件的实例 --> </ol>
但是这样会为每个待办项渲染同样的文本,这看起来并不炫酷,我们应该能将数据从父作用域传到子组件。让我们来修改一下组件的定义,使之能够接受一个属性:
<div id="appa"> <p>{{message}}</p> <span v-bind:title="message">鼠标悬停几秒钟查看此处动态绑定的提示信息!</span> <p v-if="seen">现在你看到我了</p> <ol> <li v-for="todo in todos">{{ todo.text }}</li> </ol> <button v-on:click="reverseMessage">逆转消息</button> <input v-model="message"/> <ol><!-- 现在我们为每个todo-item提供待办项对象;待办项对象是变量,即其内容可以是动态的 --> <todo-item v-for="item in groceryList" v-bind:todo="item"></todo-item> </ol> </div> <script src="js/vue.js"></script> <script> Vue.component('todo-item',{ props:['todo'], template:'<li>{{ todo.text }}</li>' }) var appa = new Vue({ el:'#appa', data:{ message:'Hello Vue.js!', seen: true, todos: [ { text: '学习 JavaScript' }, { text: '学习 Vue' }, { text: '整个牛项目' } ], groceryList:[ { text: '蔬菜' }, { text: '奶酪' }, { text: '随便其他什么人吃的东西' } ] }, methods:{ reverseMessage:function(){ this.message = this.message.split('').reverse().join(''); } } }) </script>
在一个大型应用中,有必要将整个应用程序划分为组件,以使开发可管理。在后续教程中我们将详述组件,不过这里有一个(假想的)使用了组件的应用模板是什么样的例子:
与自定义元素的关系
Vue 组件非常类似于自定义元素——它是 Web 组件规范的一部分,这是因为 Vue 的组件语法部分参考了该规范。例如 Vue 组件实现了 Slot API 与 is 特性。但是,还是有几个关键差别:
984

被折叠的 条评论
为什么被折叠?



