渐进式框架 自底层向上逐层应用

CDN

  1. <!-- Staticfile CDN -->
  2. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  3. <!-- unpkg(推荐) -->
  4. <script src="https://unpkg.com/vue/dist/vue.js"></script>

声明式渲染

Vue.js核心是一个允许采用简洁模板语法来声明式地将数据渲染进DOM的系统

数据和DOM建立关联。响应式

  • 一个Vue应用会被挂载到一个DOM元素上,然后对其进行完全控制
  • 每个Vue应用都需要通过实例化Vue来实现.
  • 当一个Vue实例被创建时,它向Vue的响应式系统中加入了其data对象中能找到的所有属性。当这些属性的值发生干煸时,html视图也会发生相应改变
  • Vue.js使用了基于HTML的模板语法,允许开发者声明式地将DOM绑定至底层Vue实例的数据

指令

指令带有前缀v-,Vue提供的特殊属性,会在渲染的DOM上应用特殊的响应式行为

el 参数 挂载点

它是DOM元素中的id。

data 定义属性

用于定义属性

methods 定义函数

用于定义的函数,通过return来返回函数值

{{}} 输出和返回

用于输出对象属性和函数返回值


插值

文本

{{ }} 双大括号

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://unpkg.com/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <p>{{ message }}</p>
  11. </div>
  12. <script>
  13. new Vue({
  14. el: '#app',
  15. data: {
  16. message: '寄了'
  17. }
  18. })
  19. </script>
  20. </body>
  21. </html>

HTML—v-html

v-html指令用于设置元素的innerHTML 内容中有HTML结构会被解析为标签

实例-输出的是渲染好的h1格式的”带标题”

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <div v-html="message"></div>
  11. </div>
  12. <script>
  13. new Vue({
  14. el: '#app',
  15. data: {
  16. message: '<h1>带标题</h1>'
  17. }
  18. })
  19. </script>
  20. </body>
  21. </html>

属性

v-bind指令主要用于属性绑定下例就是绑定了class,如果checkbox被选中,则div应用class1的样式。

判断use的值,如果为true则使用class1类的样式,否则不使用该类:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. </head>
  7. <style>
  8. .class1 {
  9. background: #444;
  10. color: #eee;
  11. }
  12. </style>
  13. <body>
  14. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  15. <div id="app">
  16. <label for="r1">修改颜色</label
  17. ><input type="checkbox" v-model="use" id="r1" /> <br /><br />
  18. <div v-bind:class="{'class1': use}">v-bind:class 指令</div>
  19. </div>
  20. <script>
  21. new Vue({
  22. el: "#app",
  23. data: {
  24. use: false,
  25. },
  26. });
  27. </script>
  28. </body>
  29. </html>

表达式

提供了完全的JavaScript表达式支持

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. {{5+5}}<br />
  11. {{ ok ? 'YES' : 'NO' }}<br />
  12. {{ message.split('').reverse().join('') }}
  13. <div v-bind:id="'list-' + id">菜鸟教程</div>
  14. </div>
  15. <script>
  16. new Vue({
  17. el: "#app",
  18. data: {
  19. ok: true,
  20. message: "RUNOOB",
  21. id: 1,
  22. },
  23. });
  24. </script>
  25. </body>
  26. </html>

指令

指令是带有v-前缀的特殊属性 用于在表达式的值改变时,将某些行为应用到DOM上

实例
v-if指令会根据表达式seen的值来决定是否插入p元素。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <p v-if="seen">现在你看到我了</p>
  11. <template v-if="ok">
  12. <h1>菜鸟教程</h1>
  13. <p>学的不仅是技术,更是梦想!</p>
  14. <p>哈哈哈,打字辛苦啊!!!</p>
  15. </template>
  16. </div>
  17. <script>
  18. new Vue({
  19. el: "#app",
  20. data: {
  21. seen: true,
  22. ok: true,
  23. },
  24. });
  25. </script>
  26. </body>
  27. </html>

参数

参数在指令后用冒号指明

v-bind指令用来将这个元素的href属性与表达式url的值绑定。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <pre><a v-bind:href="url">菜鸟教程</a></pre>
  11. </div>
  12. <script>
  13. new Vue({
  14. el: "#app",
  15. data: {
  16. url: "http://www.runoob.com",
  17. },
  18. });
  19. </script>
  20. </body>
  21. </html>

修饰符

修饰符是以.指明的特殊后缀,用于指出一个指令应该以特殊的方式绑定。

  1. <form v-on:submit.prevent="onSubmit"></form>

用户输入

v-model指令在input输入框中,实现双向数据绑定 v-model指令用在 inputselecttextareacheckboxradio等表单控件元素上创建双向数据绑定,根据表单上的值,自动更新绑定的元素的值。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <p>{{ message }}</p>
  11. <input v-model="message" />
  12. </div>
  13. <script>
  14. new Vue({
  15. el: "#app",
  16. data: {
  17. message: "Runoob!",
  18. },
  19. });
  20. </script>
  21. </body>
  22. </html>

也可以使用v-on指令来对用户的输入进行响应。

实例——字符串反转

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <p>{{ message }}</p>
  11. <button v-on:click="reverseMessage">反转字符串</button>
  12. </div>
  13. <script>
  14. new Vue({
  15. el: "#app",
  16. data: {
  17. message: "Runoob!",
  18. },
  19. methods: {
  20. reverseMessage: function () {
  21. this.message = this.message.split("").reverse().join("");
  22. },
  23. },
  24. });
  25. </script>
  26. </body>
  27. </html>

过滤器

Vue允许自定义过滤器,用于常见文本格式化。

语法

  1. <!-- 在两个大括号中 -->
  2. {{ message | capitalize }}
  3. <!-- 在 v-bind 指令中 -->
  4. <div v-bind:id="rawId | formatId"></div>
  5. {{ message | filterA | filterB }}

实例——对输入的字符串的第一个字母转为大写

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">{{ message | capitalize }}</div>
  10. <script>
  11. new Vue({
  12. el: "#app",
  13. data: {
  14. message: "runoob",
  15. },
  16. filters: {
  17. capitalize: function (value) {
  18. if (!value) return "";
  19. value = value.toString();
  20. return value.charAt(0).toUpperCase() + value.slice(1);
  21. },
  22. },
  23. });
  24. </script>
  25. </body>
  26. </html>

缩写

v-bind

  1. <!-- 完整语法 -->
  2. <a v-bind:href="url"></a>
  3. <!-- 缩写 -->
  4. <a :href="url"></a>

v-on

为元素绑定事件 可简写为@ 方法内部可以通过this关键字可以访问定义在data中数据

  1. <!-- 完整语法 -->
  2. <a v-bind:href="url"></a>
  3. <!-- 缩写 -->
  4. <a :href="url"></a>

条件语句

v-if

条件判断使用v-if指令,根据表达式seen的值来决定是否插入p元素。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <p v-if="seen">现在你看到我了</p>
  11. <template v-if="ok">
  12. <h1>菜鸟教程</h1>
  13. <p>学的不仅是技术,更是梦想!</p>
  14. <p>哈哈哈,打字辛苦啊!!!</p>
  15. </template>
  16. </div>
  17. <script>
  18. new Vue({
  19. el: '#app',
  20. data: {
  21. seen: true,
  22. ok: true
  23. }
  24. })
  25. </script>
  26. </body>
  27. </html>

v-else

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <div v-if="Math.random() > 0.5">Sorry</div>
  11. <div v-else>Not sorry</div>
  12. </div>
  13. <script>
  14. new Vue({
  15. el: "#app",
  16. });
  17. </script>
  18. </body>
  19. </html>

v-else-if

用作v-if的else-if块 可以链式的多次使用

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <div v-if="type === 'A'">A</div>
  11. <div v-else-if="type === 'B'">B</div>
  12. <div v-else-if="type === 'C'">C</div>
  13. <div v-else>Not A/B/C</div>
  14. </div>
  15. <script>
  16. new Vue({
  17. el: "#app",
  18. data: {
  19. type: "B",
  20. },
  21. });
  22. </script>
  23. </body>
  24. </html>

v-show

v-show指令根据条件展示元素。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <h1 v-show="ok">Hello!</h1>
  11. </div>
  12. <script>
  13. new Vue({
  14. el: "#app",
  15. data: {
  16. ok: true,
  17. },
  18. });
  19. </script>
  20. </body>
  21. </html>

循环语句

v-for

根据数据生成列表结构 语法:(item,index)in 数据 item和index可以和其他指令一起使用 数组长度的更新会同步到页面上,为响应式的 特殊语法:site in sites site是源数据数组,site是数组元素迭代的别名。 v-for可以绑定数据到数组来渲染一个列表

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>v-for 实例</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <ol>
  11. <li v-for="A in B">{{ A.name }}</li>
  12. </ol>
  13. </div>
  14. <script>
  15. new Vue({
  16. el: "#app",
  17. data: {
  18. B: [
  19. { name: "春" },
  20. { name: "夏" },
  21. { name: "秋" },
  22. { name: "冬" },
  23. ],
  24. },
  25. });
  26. </script>
  27. </body>
  28. </html>

在模板中使用v-for

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <ul>
  11. <template v-for="site in sites">
  12. <li>{{ site.name }}</li>
  13. <li>--------------</li>
  14. </template>
  15. </ul>
  16. </div>
  17. <script>
  18. new Vue({
  19. el: '#app',
  20. data: {
  21. sites: [
  22. { name: 'Runoob' },
  23. { name: 'Google' },
  24. { name: 'Taobao' }
  25. ]
  26. }
  27. })
  28. </script>
  29. </body>
  30. </html>

v-for 迭代对象

通过一个对象的属性来迭代数据 有三个参数

  • value属性
  • key参数
  • index索引
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <ul>
  11. <li v-for="(value, key, index) in object">
  12. {{ index }}. {{ key }} : {{ value }}
  13. </li>
  14. </ul>
  15. </div>
  16. <script>
  17. new Vue({
  18. el: "#app",
  19. data: {
  20. object: {
  21. name: "菜鸟教程",
  22. url: "http://www.runoob.com",
  23. slogan: "学的不仅是技术,更是梦想!",
  24. },
  25. },
  26. });
  27. </script>
  28. </body>
  29. </html>

计算属性

computed用于处理一些复杂逻辑

computed

实例-反转字符串

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <p>原始字符串: {{ message }}</p>
  11. <p>计算后反转字符串: {{ reversedMessage }}</p>
  12. </div>
  13. <script>
  14. var vm = new Vue({
  15. el: "#app",
  16. data: {
  17. message: "Runoob!",
  18. },
  19. computed: {
  20. // 计算属性的 getter
  21. reversedMessage: function () {
  22. // `this` 指向 vm 实例
  23. return this.message.split("").reverse().join("");
  24. },
  25. },
  26. });
  27. </script>
  28. </body>
  29. </html>

computed vs methods

两者效果一样

  • 但computed是基于它的依赖缓存,只有相关依赖发生变化时才重新取值。
  • 而使用methods,在重新渲染的时候,函数总会重新调用执行。

computed性能会更好,但不希望缓存的时候可以选择使用methods属性。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <p>原始字符串: {{ message }}</p>
  11. <p>计算后反转字符串: {{ reversedMessage }}</p>
  12. <p>使用方法后反转字符串: {{ reversedMessage2() }}</p>
  13. </div>
  14. <script>
  15. var vm = new Vue({
  16. el: "#app",
  17. data: {
  18. message: "Runoob!",
  19. },
  20. computed: {
  21. // 计算属性的 getter
  22. reversedMessage: function () {
  23. // `this` 指向 vm 实例
  24. return this.message.split("").reverse().join("");
  25. },
  26. },
  27. methods: {
  28. reversedMessage2: function () {
  29. return this.message.split("").reverse().join("");
  30. },
  31. },
  32. });
  33. </script>
  34. </body>
  35. </html>

computed属性默认只有getter,不过在需要的时候,也可以提供一个setter

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <p>{{ site }}</p>
  11. </div>
  12. <script>
  13. var vm = new Vue({
  14. el: "#app",
  15. data: {
  16. name: "Google",
  17. url: "http://www.google.com",
  18. },
  19. computed: {
  20. site: {
  21. // getter
  22. get: function () {
  23. return this.name + " " + this.url;
  24. },
  25. // setter
  26. set: function (newValue) {
  27. var names = newValue.split(" ");
  28. this.name = names[0];
  29. this.url = names[names.length - 1];
  30. },
  31. },
  32. },
  33. });
  34. // 调用 setter, vm.name 和 vm.url 也会被对应更新
  35. vm.site = "八嘎呀路 http://www.runoob.com";
  36. document.write("name: " + vm.name);
  37. document.write("<br>");
  38. document.write("url: " + vm.url);
  39. </script>
  40. </body>
  41. </html>

监听属性

通过watch来响应数据的变化

理解watch

  1. var vm=new Vue({
  2. el:'#app'
  3. data:{
  4. 一个数据:''
  5. },
  6. watch:{
  7. //这个函数有两个参数
  8. //newVal改变后的值
  9. //oldVal改变前的值
  10. '一个数据':fuction(){
  11. //对数据变化后进行处理
  12. },
  13. '$route.path':fuction(){
  14. //对Vue实例中存放的对象进行监听
  15. //数据变化后进行处理
  16. //!!只要能够获取的对象,都能被watch监听
  17. }
  18. }
  19. })

实例-计数器

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <p style="font-size: 25px">计数器: {{ counter }}</p>
  11. <button @click="counter++" style="font-size: 25px">点我</button>
  12. </div>
  13. <script type="text/javascript">
  14. var vm = new Vue({
  15. el: "#app",
  16. data: {
  17. counter: 1,
  18. },
  19. });
  20. // vm.$watch("counter", function (nval, oval) {
  21. // alert("计数器值的变化 :" + oval + " 变为 " + nval + "!");
  22. // });
  23. </script>
  24. </body>
  25. </html>

实例-千米和米换算

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="computed_props">
  10. 千米 : <input type="text" v-model="kilometers" />
  11. 米 :<input type="text" v-model="meters" />
  12. </div>
  13. <p id="info"></p>
  14. <script type="text/javascript">
  15. var vm = new Vue({
  16. el: "#computed_props",
  17. data: {
  18. kilometers: 0,
  19. meters: 0,
  20. },
  21. // methods: {},
  22. // computed: {},
  23. watch: {
  24. kilometers: function (val) {
  25. this.kilometers = val;
  26. this.meters = this.kilometers * 1000;
  27. },
  28. meters: function (val) {
  29. this.kilometers = val / 1000;
  30. this.meters = val;
  31. },
  32. },
  33. });
  34. // $watch 是一个实例方法
  35. vm.$watch("kilometers", function (newValue, oldValue) {
  36. // 这个回调将在 vm.kilometers 改变后调用
  37. document.getElementById("info").innerHTML =
  38. "修改前值为: " + oldValue + ",修改后值为: " + newValue;
  39. });
  40. </script>
  41. </body>
  42. </html>

样式绑定

利用v-bind指令设置样式属性。 v-bind在处理结果class和stylee时,表达式的结果类型除了字符串之外,还可以是对象或数组。

class属性绑定

可以在对象中传入更多属性用来切换多个class

  1. <div id="app">
  2. <div
  3. class="static"
  4. v-bind:class="{ 'active': isActive, 'text-danger': hasError }"
  5. ></div>
  6. </div>
  7. <script>
  8. new Vue({
  9. el: "#app",
  10. data: {
  11. isActive: true,
  12. hasError: false,
  13. },
  14. });
  15. </script>

也可以直接绑定数据里的一个对象

  1. <div id="app">
  2. <div v-bind:class="classObject"></div>
  3. </div>
  4. <script>
  5. new Vue({
  6. el: "#app",
  7. data: {
  8. classObject: {
  9. active: true,
  10. "text-danger": true,
  11. },
  12. },
  13. });
  14. </script>

数组语法

可以把数组传给v-bind:class

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. <style>
  8. .active {
  9. width: 100px;
  10. height: 100px;
  11. background: green;
  12. }
  13. .text-danger {
  14. background: red;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <div id="app">
  20. <div v-bind:class="[activeClass, errorClass]"></div>
  21. </div>
  22. <script>
  23. new Vue({
  24. el: '#app',
  25. data: {
  26. activeClass: 'active',
  27. errorClass: 'text-danger'
  28. }
  29. })
  30. </script>
  31. </body>
  32. </html>

也可以使用三元表达法来切换列表中的class

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. <style>
  8. .text-danger {
  9. width: 100px;
  10. height: 100px;
  11. background: red;
  12. }
  13. .active {
  14. width: 100px;
  15. height: 100px;
  16. background: green;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <div id="app">
  22. <div v-bind:class="[errorClass ,isActive ? activeClass : '']"></div>
  23. </div>
  24. <script>
  25. new Vue({
  26. el: "#app",
  27. data: {
  28. isActive: false,
  29. activeClass: "active",
  30. errorClass: "text-danger",
  31. },
  32. });
  33. </script>
  34. </body>
  35. </html>

style(内联样式)

直接设置样式

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }">
  11. 菜鸟教程
  12. </div>
  13. </div>
  14. <script>
  15. new Vue({
  16. el: "#app",
  17. data: {
  18. activeColor: "green",
  19. fontSize: 60,
  20. },
  21. });
  22. </script>
  23. </body>
  24. </html>

直接绑定到一个样式对象,让模板更清晰

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <div v-bind:style="styleObject">菜鸟教程</div>
  11. </div>
  12. <script>
  13. new Vue({
  14. el: "#app",
  15. data: {
  16. styleObject: {
  17. color: "green",
  18. fontSize: "30px",
  19. },
  20. },
  21. });
  22. </script>
  23. </body>
  24. </html>

也可以使用数组将多个样式对象应用到一个元素上

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <div v-bind:style="[baseStyles, overridingStyles]">菜鸟教程</div>
  11. </div>
  12. <script>
  13. new Vue({
  14. el: "#app",
  15. data: {
  16. baseStyles: {
  17. color: "green",
  18. fontSize: "30px",
  19. },
  20. overridingStyles: {
  21. "font-weight": "bold",
  22. },
  23. },
  24. });
  25. </script>
  26. </body>
  27. </html>

事件处理器

事件监听使用v-on指令

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <button v-on:click="counter += 1">增加 1</button>
  11. <p>这个按钮被点击了 {{ counter }} 次。</p>
  12. </div>
  13. <script>
  14. new Vue({
  15. el: "#app",
  16. data: {
  17. counter: 0,
  18. },
  19. });
  20. </script>
  21. </body>
  22. </html>

v-on也可以接收一个定义的发来调用

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 </title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <!-- `greet` 是在下面定义的方法名 -->
  11. <button v-on:click="greet">Greet</button>
  12. </div>
  13. <script>
  14. var app = new Vue({
  15. el: "#app",
  16. data: {
  17. name: "Vue.js",
  18. },
  19. // 在 `methods` 对象中定义方法
  20. methods: {
  21. greet: function (event) {
  22. // `this` 在方法里指当前 Vue 实例
  23. alert("Hello " + this.name + "!");
  24. // `event` 是原生 DOM 事件
  25. if (event) {
  26. alert(event.target.tagName);
  27. }
  28. },
  29. },
  30. });
  31. // 也可以用 JavaScript 直接调用方法
  32. app.greet(); // -> 'Hello Vue.js!'
  33. </script>
  34. </body>
  35. </html>

也可以使用内联Js语句

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <button v-on:click="say('hi')">Say hi</button>
  11. <button v-on:click="say('what')">Say what</button>
  12. </div>
  13. <script>
  14. new Vue({
  15. el: "#app",
  16. methods: {
  17. say: function (message) {
  18. alert(message);
  19. },
  20. },
  21. });
  22. </script>
  23. </body>
  24. </html>

事件修饰符

提供给v-on来处理DOM事件细节 通过由.表示的指令后缀来调用修饰符

  • .stop - 阻止冒泡-不会一直传递,自己运行结束就结束了。
  • .prevent - 阻止默认事件-比如submit加了这个就不会提交了
  • .capture - 阻止捕获-在传递的父子事件中 ,加了这个,无论先点哪个,都先执行这个
  • .self - 只监听触发该元素的事件-只有点击自己本身才会执行,点子元素也不会传递
  • .once - 只触发一次
  • .left - 左键事件
  • .right - 右键事件
  • .middle - 中间滚轮事件
  1. <!-- 阻止单击事件冒泡 -->
  2. <a v-on:click.stop="doThis"></a>
  3. <!-- 提交事件不再重载页面 -->
  4. <form v-on:submit.prevent="onSubmit"></form>
  5. <!-- 修饰符可以串联 -->
  6. <a v-on:click.stop.prevent="doThat"></a>
  7. <!-- 只有修饰符 -->
  8. <form v-on:submit.prevent></form>
  9. <!-- 添加事件侦听器时使用事件捕获模式 -->
  10. <div v-on:click.capture="doThis">...</div>
  11. <!-- 只当事件在该元素本身(而不是子元素)触发时触发回调 -->
  12. <div v-on:click.self="doThat">...</div>
  13. <!-- click 事件只能点击一次,2.1.4版本新增 -->
  14. <a v-on:click.once="doThis"></a>

按键修饰符

vue允许v-on在监听键盘事件时添加按键修饰符

按键别名

  • .enter.tab
  • .delete (捕获 “删除” 和 “退格” 键)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right
  • .ctrl
  • .alt
  • .shift
  • .meta

表单

使用v-model指令在表单元素上创建双向数据绑定

实例-对input元素和textarea元素使用双向数据绑定

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <p>input 元素:</p>
  11. <input v-model="message" placeholder="编辑我……" />
  12. <p>消息是: {{ message }}</p>
  13. <p>textarea 元素:</p>
  14. <p style="white-space: pre">{{ message2 }}</p>
  15. <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
  16. </div>
  17. <script>
  18. new Vue({
  19. el: "#app",
  20. data: {
  21. message: "Runoob",
  22. message2: "菜鸟教程\r\nhttp://www.runoob.com",
  23. },
  24. });
  25. </script>
  26. </body>
  27. </html>

实例-复选框

多个复选框可绑定同一数组

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <p>单个复选框:</p>
  11. <input type="checkbox" id="checkbox" v-model="checked" />
  12. <label for="checkbox">{{ checked }}</label>
  13. <p>{{ checked }}</p>
  14. <p>多个复选框:</p>
  15. <input
  16. type="checkbox"
  17. id="runoob"
  18. value="Runoob"
  19. v-model="checkedNames"
  20. />
  21. <label for="runoob">Runoob</label>
  22. <input
  23. type="checkbox"
  24. id="google"
  25. value="Google"
  26. v-model="checkedNames"
  27. />
  28. <label for="google">Google</label>
  29. <input
  30. type="checkbox"
  31. id="taobao"
  32. value="Taobao"
  33. v-model="checkedNames"
  34. />
  35. <label for="taobao">Taobao</label>
  36. <br />
  37. <input type="checkbox" value="baga" v-model="checkedNames" />
  38. <label for="baga">baga</label>
  39. <br />
  40. <span>选择的值为: {{ checkedNames }}</span>
  41. </div>
  42. <script>
  43. new Vue({
  44. el: "#app",
  45. data: {
  46. checked: true,
  47. checkedNames: [],
  48. },
  49. });
  50. </script>
  51. </body>
  52. </html>

实例-单选框

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <input type="radio" id="runoob" value="Runoob" v-model="picked" />
  11. <label for="runoob">Runoob</label>
  12. <br />
  13. <input type="radio" id="google" value="Google" v-model="picked" />
  14. <label for="google">Google</label>
  15. <br />
  16. <span>选中值为: {{ picked }}</span>
  17. </div>
  18. <script>
  19. new Vue({
  20. el: "#app",
  21. data: {
  22. picked: "Runoob",
  23. },
  24. });
  25. </script>
  26. </body>
  27. </html>

实例-select列表

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <select v-model="selected" name="fruit">
  11. <option value="">选择一个网站</option>
  12. <option value="www.runoob.com">Runoob</option>
  13. <option value="www.google.com">Google</option>
  14. </select>
  15. <div id="output">选择的网站是: {{selected}}</div>
  16. </div>
  17. <script>
  18. new Vue({
  19. el: "#app",
  20. data: {
  21. selected: "",
  22. },
  23. });
  24. </script>
  25. </body>
  26. </html>

修饰符

.lazy

默认情况下,v-model是在input事件触发后将输入框的值与数据进行同步
而在添加lazy修饰符之后,会转变为在change事件之后进行同步

.number

自动将用户的输入值转为数值类型,因为即使在 type="number"时,HTML 输入元素的值也总会返回字符串。如果这个值无法被 parseFloat()解析,则会返回原始的值。

.trim

自动过滤用户输入的首尾空白字符


组件

组件可以扩展HTML元素,封装可重用的代码 组件系统可以让我们用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树 语法:

  • Vue.component(tagName, options)

tagName为组件名,option为配置选项

全局组件

所有实例都能使用

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 </title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <runoob></runoob>
  11. <runoob></runoob>
  12. </div>
  13. <div id="ppa">
  14. <runoob></runoob>
  15. <runoob></runoob>
  16. </div>
  17. <script>
  18. // 注册
  19. Vue.component("runoob", {
  20. template: "<h1>自定义组件!</h1>",
  21. });
  22. // 创建根实例
  23. new Vue({
  24. el: "#app",
  25. });
  26. new Vue({
  27. el:"#ppa",
  28. });
  29. </script>
  30. </body>
  31. </html>

局部组件

也可以在实例选项中注册局部组件,这样组件只能在这个实例中使用

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <runoob></runoob>
  11. <runoob></runoob>
  12. </div>
  13. <div id="ppa">
  14. <runoob></runoob>
  15. <runoob></runoob>
  16. </div>
  17. <script>
  18. var Child = {
  19. template: "<h1>自定义组件!</h1>",
  20. };
  21. // 创建根实例
  22. new Vue({
  23. el: "#app",
  24. components: {
  25. // <runoob> 将只在父模板可用
  26. runoob: Child,
  27. },
  28. });
  29. new Vue({
  30. el: "#ppa",
  31. });
  32. </script>
  33. </body>
  34. </html>

Prop

prop是子组件用来接受父组件传递过来的数据的一个自定义属性。 父组件的数据需要通过props把数据传给子组件,子组件需要显式地用 props选项声明”prop”

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <child message="hello!"></child>
  11. </div>
  12. <script>
  13. // 注册
  14. Vue.component("child", {
  15. // 声明 props
  16. props: ["message"],
  17. // 同样也可以在 vm 实例中像 “this.message” 这样使用
  18. template: "<span>{{ message }}</span>",
  19. });
  20. // 创建根实例
  21. new Vue({
  22. el: "#app",
  23. });
  24. </script>
  25. </body>
  26. </html>

动态 Prop

类似于v-bind绑定HTML特性到一个表达式,也可以用v-bind动态绑定props的值到父组件的数据当中。 每当父组件的数据变化时,该变化也会传导给子组件 porp是单向绑定 的,当父组件属性边变化时,将传导给子组件,但不会反过来

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <div>
  11. <input v-model="parentMsg" />
  12. <br />
  13. <child v-bind:message="parentMsg"></child>
  14. </div>
  15. </div>
  16. <script>
  17. // 注册
  18. Vue.component("child", {
  19. // 声明 props
  20. props: ["message"],
  21. // 同样也可以在 vm 实例中像 “this.message” 这样使用
  22. template: "<h1>{{ message }}</h1>",
  23. });
  24. // 创建根实例
  25. new Vue({
  26. el: "#app",
  27. data: {
  28. parentMsg: "八嘎",
  29. },
  30. });
  31. </script>
  32. </body>
  33. </html>

使用v-bind指令将todo传到每一个重复的组件

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <ol>
  11. <todo-item v-for="item in sites" v-bind:todo="item"></todo-item>
  12. </ol>
  13. </div>
  14. <script>
  15. Vue.component("todo-item", {
  16. props: ["todo"],
  17. template: "<li>{{ todo.text }}</li>",
  18. });
  19. new Vue({
  20. el: "#app",
  21. data: {
  22. sites: [{ text: "Runoob" }, { text: "Google" }, { text: "Taobao" }],
  23. },
  24. });
  25. </script>
  26. </body>
  27. </html>

Prop验证❌

组件可以为props指定验证要求 可以为props中的值提供 一个带有验证需求的对象,而不是一个字符串数字组。


组件-自定义事件❗

父组件是用props传递数据给子组件,但如果子组件要把数据传递回去,就需要使用自定义事件。


自定义指令

允许注册自定义指令 自定义指令解决的问题是对普通DOM元素进行底层操作。 Vue.directive

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  6. <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <p>页面载入时,input 元素自动获取焦点:</p>
  11. <input v-focus />
  12. </div>
  13. <script>
  14. // 注册一个全局自定义指令 v-focus
  15. Vue.directive("focus", {
  16. // 当绑定元素插入到 DOM 中。
  17. inserted: function (el) {
  18. // 聚焦元素
  19. el.focus();
  20. },
  21. });
  22. // 创建根实例
  23. new Vue({
  24. el: "#app",
  25. });
  26. </script>
  27. </body>
  28. </html>

v-text

设置标签的内容(textContent) 默认会替换所有内容,使用插值表达式可以替换指定内容 内部也支持表达式

  1. <div id="app">
  2. <!--
  3. 注意:在指令中不要写插值语法 直接写对应的变量名称
  4. 在 v-text 中 赋值的时候不要在写 插值语法
  5. 一般属性中不加 {{}} 直接写 对应 的数据名
  6. -->
  7. <p v-text="msg">312asda 31231 </p>
  8. <p>
  9. <!-- Vue 中只有在标签的 内容中 才用插值语法 -->
  10. {{msg}}
  11. </p>
  12. </div>
  13. <script>
  14. new Vue({
  15. el: '#app',
  16. data: {
  17. msg: 'Hello Vue.js'
  18. }
  19. });
  20. </script>

v-html

输出html代码

v-bind

作用:为元素绑定属性 写法:v-bind:属性名 简写:省略v-bind,只保留:属性名 需要动态的增删的class建议使用对象的方式

v-if

作用:根据表达式的真假切换元素的显示状态 本质:是通过操纵DOM元素来切换显示状态 表达式为true时,元素存在于dom树中,为false时,从dom树中移除 频繁切换使用v-show,反之使用v-if,前者消耗小

v-else

v-else-if

链式使用

v-on

绑定事件
缩写

  1. <!-- 完整语法 -->
  2. <a v-on:click="doSomething"></a>
  3. <!-- 缩写 -->
  4. <a @click="doSomething"></a>

v-model

实现双向数据绑定
监听用户数据输入事件以更新数据
表单应用

v-show

作用:根据真假切换元素的显示状态 原理:就是修改元素的display来实现显示隐藏 指令后面的内容,最终都会被解析为布尔值 数据改变之后,对应元素的显示状态会同步更新

v-for

特殊语法:site in sites
绑定数据到数组来渲染一个列表
迭代对象
迭代整数-循环整数

v-pre

跳过这个元素和其子元素的编译过程。加快编译
用于显示原始的Mustache 标签。

v-once

只渲染元素和组件一次。
随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。
当数据改变时,插值处的内容不会更新
这可以用于优化更新性能。

watch

数组语法

  1. <!-- 指定vue管理内容区域,需要通过vue展示的内容都要放到找个元素中 通常我们也把它叫做边界 数据只在边界内部解析-->
  2. <div id="app">{{ msg }}</div>
  3. <!-- 引入 vue.js -->
  4. <script src="vue.js"></script>
  5. <!-- 使用 vue -->
  6. <script>
  7. var vm = new Vue({
  8. // el:提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标
  9. el: '#app',
  10. // Vue 实例的数据对象,用于给 View 提供数据
  11. data: {
  12. msg: 'Hello Vue'
  13. }
  14. })
  15. </script>

双向数据绑定 two way data binding

过滤器 filter

文本数据格式化

实例生命周期