• 视图中的Directive (指令)
    • 前提: 在directive中要使用表达式(Expression)
    • 循环: v-for
    • 判断: v-if
    • v-if 与 v-for 的优先级
    • v-bind
    • v-on
      • v-on的简写
    • v-model 与双向绑定

    视图中的Directive (指令)

    我们在学习java的时候,知道有jsp 页面, 对于.net语言,有 .asp, aspx页面, 对于ruby, 有erb这样的页面。

    在Vuejs中,我们也有类似的编程能力。

    但是由于 Vuejs 是一种框架,所以它的稍微特殊一些,只能与标签做结合使用。 叫做Directive. (指令)

    我们之前看到的 v-on, v-bind, v-if, v-for 等等,只要是以v开头的,都是Directive.

    原理:

    1. 用户在浏览器中输入网址,回车.
    2. 浏览器加载所有的资源(js, html内容。) 此时尚未解析。
    3. 浏览器加载Vuejs
    4. Vuejs程序被执行, 发现 页面中的 Directive, 进行相关的解析
    5. HTML中的内容被替换。 展现给用户。

    所以,我们在开发一个Vuejs项目的时候,会看到大量的Directive。 这里的基础务必打好。

    前提: 在directive中要使用表达式(Expression)

    • 表达式: a > 1 (有效)
    • 普通的语句: a = 1 ; (这是个声明,不会生效)
    • 流控制语句: return a; (不会生效)

    在所有的Directive中,都只能使用表达式。

    正确的:

    1. <div v-if="a > 100">
    2. </div>

    错误的:

    1. <div v-if="return false">
    2. </div>

    循环: v-for

    完整的例子如下:

    1. <html>
    2. <head>
    3. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    4. </head>
    5. <body>
    6. <div id='app'>
    7. <p>Vuejs周边的技术生态有: <p>
    8. <br/>
    9. <ul>
    10. <li v-for="tech in technologies">
    11. {% raw %}{{{% endraw %}tech}}
    12. </li>
    13. </ul>
    14. </div>
    15. <script>
    16. var app = new Vue({
    17. el: '#app',
    18. data: {
    19. technologies: [
    20. "nvm", "npm", "node", "webpack", "ecma_script"
    21. ]
    22. }
    23. })
    24. </script>
    25. </body>
    26. </html>

    可以注意到,上面代码中的 technologies是在data 中被定义的:

    1. data: {
    2. technologies: [
    3. "nvm", "npm", "node", "webpack", "ecma_script"
    4. ]
    5. }

    然后在下面代码中, 被循环显示:

    1. <li v-for="tech in technologies">
    2. {{tech}}
    3. </li>

    用浏览器打开上面代码后,如下图所示:

    v-for循环

    判断: v-if

    条件Directive, 是由 v-if, v-else-if, v-else 配合完成的。 下面是个完整的例子:

    1. <html>
    2. <head>
    3. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    4. </head>
    5. <body>
    6. <div id='app'>
    7. <p>我们要使用的技术是: <p>
    8. <div v-if="name === 'vuejs'">
    9. Vuejs !
    10. </div>
    11. <div v-else-if="name === 'angular'">
    12. Angular
    13. </div>
    14. <div v-else>
    15. React
    16. </div>
    17. </div>
    18. <script>
    19. var app = new Vue({
    20. el: '#app',
    21. data: {
    22. name: 'vuejs'
    23. }
    24. })
    25. </script>
    26. </body>
    27. </html>

    注意,

    上面的代码中, v-if 后面的引号中,是 name === 'vuejs', === 是 Ecmascript 的语言, 表示严格的判断。(由于js的 == 有先天的缺陷,所以我们在95%的情况下, 都是用 三个等号的形式)

    用浏览器打开上面代码后,如下图所示:

    v-if 判断

    v-if 与 v-for 的优先级

    v-ifv-for 一起使用时,v-for 具有比 v-if 更高的优先级。 也就是说,Vuejs 会先执行 v-for, 再执行 v-if .

    下面是个完整的例子:

    1. <html>
    2. <head>
    3. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    4. </head>
    5. <body>
    6. <div id='app'>
    7. <p> 全部的技术是: {{technologies}} </p>
    8. <p> v-for 与 v-if 的结合使用, 只打印出 以"n"开头的技术: <p>
    9. <ul>
    10. <li v-for="tech in technologies" v-if="tech.indexOf('n') === 0">
    11. {% raw %}{{{% endraw %}tech}}
    12. </li>
    13. </ul>
    14. </div>
    15. <script>
    16. var app = new Vue({
    17. el: '#app',
    18. data: {
    19. technologies: [
    20. "nvm", "npm", "node", "webpack", "ecma_script"
    21. ]
    22. }
    23. })
    24. </script>
    25. </body>
    26. </html>

    可以看到, 在下面的代码中, v-ifv-for结合使用了, 先是做了循环 tech in technologies,然后对当前的 循环对象 tech 做了判断:

    1. <li v-for="tech in technologies" v-if="tech.indexOf('n') === 0">
    2. {% raw %}{{{% endraw %}tech}}
    3. </li>

    用浏览器打开上面代码后,如下图所示:

    v-for与 v-if的结合使用

    v-bind

    v-bind指令用于把某个属性绑定到对应的元素的属性。 请看例子:

    1. <html>
    2. <head>
    3. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    4. </head>
    5. <body>
    6. <div id='app'>
    7. <p v-bind:style="'color:' + my_color">Vuejs 学起来好开心~ </p>
    8. </div>
    9. <script>
    10. var app = new Vue({
    11. el: '#app',
    12. data: {
    13. my_color: 'green'
    14. }
    15. })
    16. </script>
    17. </body>
    18. </html>

    在上面的代码中,可以看到, 通过 v-bind, 把<p>元素的style的值,绑定成了 'color:' + my_color 这个表达式。当 my_color 的值发生变化的时候, 对应<p>的颜色就会发生变化。

    例如: 默认页面打开后, 是绿色的。 如下图所示:

    v-bind的效果

    如何知道变量my_color 已经绑定到了 <p> 上了呢? 我们在 console中做修改, 让 app.my_color = "red", 就可以看到对应的文字的颜色,变成了红色,如下图所示:

    v-bind修改后的效果

    对于所有的属性,都可以使用 v-bind, 例如:

    1. <div v-bind:style='...'>
    2. </div>

    会生成:

    1. <div style='...'> </div>
    1. <div v-bind:class='...'> </div>

    会生成:

    1. <div class='...'> </div>
    1. <div v-bind:id='...'> </div>

    会生成:

    1. <div id='...'> </div>

    v-on

    v-on 指令用于触发事件。 例如:

    1. <html>
    2. <head>
    3. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    4. </head>
    5. <body>
    6. <div id='app'>
    7. {{ message }}
    8. <br/>
    9. <button v-on:click='highlight' style='margin-top: 50px'>真的吗</button>
    10. </div>
    11. <script>
    12. var app = new Vue({
    13. el: '#app',
    14. data: {
    15. message: '学习Vuejs使我快乐~ '
    16. },
    17. methods: {
    18. highlight: function() {
    19. this.message = this.message + '是的, 工资还会涨~!'
    20. }
    21. }
    22. })
    23. </script>
    24. </body>
    25. </html>

    上面的代码中, 通过v-on:click 的声明,当