vue模板语法

vue模板语法

vue.js使用了基于HTML的模板语法,允许开发者声明式的将DOM绑定质底层Vue实例的数据,所有Vue.js的模板都是合法的HTML,所有能被遵循规范的浏览器和HTML解析器解析

 

插值文本

数据绑定最常见的形式就是使用”Mustache“语法{{}} 就是2个大括号的文本插值

特性:

HTML特性不能使用Mustache语法,应该用v-bind指令

案例:设置标题

   <!-- 宿主文件 -->
   <div id="app">
     <h2 v-bind:title="student" >
         <!-- ""后面决定鼠标碰到文本显示的文字 -->
         <!-- 动态绑定标题,当鼠标碰到h2里的内容会显示标题购物车 -->
         <!-- :title="title"  -->
         <!-- 插值文本 -->
        {{title}}
        {{student}}
       
       </h2>
   </div>
   <script src="vue.js"></script>
   <script>
   //   1.创建实例
      const app =  new Vue({
         el:'#app',
         data() {
             //数据的指定,vdata
             return {
                 title: '购物车',
                 student: '炽焱'
                 //数据
            }
        },

      })
   

   </script>
总结:如截图所示
    用v-bind指令来设置标题
    2.后面的数据名决定鼠标碰到文本显示的是什么东西
    3.这个是动态绑定标题 ,当鼠标碰到h2里的内容会显示标题购物车
    4.2种方法:
       v-bind:title="student"
      :title="studen"
       

结果:

 

 

列表渲染

我们可以用 v-for 指令基于一个数组来渲染一个列表。 v-for指令需要使用item in items 形式的特殊语法,其中items 是原数组的数组 , 而item 则是原数组的别名

案例: 课程列表

   <!-- 宿主文件 -->
   <div id="app">
     <h2 v-bind:title="student" >
         <!-- ""后面决定鼠标碰到文本显示的文字 -->
         <!-- 动态绑定标题,当鼠标碰到h2里的内容会显示标题购物车 -->
         <!-- :title="titleS"  -->
         <!-- 插值文本 -->
        {{title}}
        {{student}}
     </h2>

        <!-- 列表渲染 -->
          <div v-for="c in courses" :key="c">
              <!-- 用vfor来把需要的课程遍历出来 -->
              <!-- c别名相当于下面的课程 后面引用前面取得名字 -->
              <div>{{ c}}</div>
          </div>

   </div>
   <script src="vue.js"></script>
   <script>
   //   1.创建实例
      const app =  new Vue({
         el:'#app',
         data() {
             //数据的指定,vdata
             return {
                 title: '购物车',
                 student: '炽焱',
                 courses:['羽毛球课','前端开发','java开发']
            }
        }

      })
   
总结:1.用vfor来把需要的课程遍历出来
    2.item 是别名可以任意取
    3.items 是下面数组名
   

结果:可以看出来是把课程都遍历出来了,跟原生的for循环差不多

 

 

 

 

表单的绑定/事件处理

1.表单的绑定 :用v-model指令在表单<input><textarea><select>元素上创建双向数据的绑定,他会根据控件类型自动选取正确的方法跟新元素,v-model会进行特殊处理

<input v-model="course" type="text" v-on:keydown.enter="addCourse"/>

2,事件处理:用v-on来监听dom事件从而触发js的代码

<input v-model="course" type="text" v-on:keydown.enter="addCourse"/>
<button @click="addCourse">新增</button>
           <!-- 1.v-on:click触发监听事件 2.@click -->
           <!-- vmodel 双向的绑定,只能绑定input text,进行数据的交互 -->
           <!-- {{course}} -->

 

在原先的基础上加上表单的绑定,新增课程

  <!-- 宿主文件 -->
   <div id="app">
     <h2 v-bind:title="student" >
         <!-- ""后面决定鼠标碰到文本显示的文字 -->
         <!-- 动态绑定标题,当鼠标碰到h2里的内容会显示标题购物车 -->
         <!-- :title="titleS"  -->
         <!-- 插值文本 -->
        {{title}}
        {{student}}
     </h2>
       <!-- 用户输入 -->
       <p>
           <input v-model="course" type="text" v-        on:keydown.enter="addCourse"/>
           <button @click="addCourse">新增</button>
           <!-- 1.v-on:click触发监听事件 2.@click -->
           <!-- vmodel 双向的绑定,只能绑定input text,进行数据的交互 -->
           <!-- {{course}} -->
       </p>
        <!-- 列表渲染 -->
          <div v-for="c in courses" :key="c">
              <!-- 用vfor来把需要的课程遍历出来 -->
              <!-- c别名相当于下面的课程 后面引用前面取得名字 -->
              <div>{{ c}}</div>
          </div>
   </div>
   <script src="vue.js"></script>
   <script>
   //   1.创建实例
      const app =  new Vue({
         el:'#app',
         data() {
             //数据的指定,vdata
             return {
                 title: '购物车',
                 student: '炽焱',
                 course:'',
                 //数据
                 courses:['羽毛球课','前端开发','java开发']
            }
        },
         methods: {
             //点击事件用methods方法
             // 注意要用vmethods才行
             addCourse() {
                 //1。添加course到数组
                 this.courses.push(this.course)
                 //2.清空course
                 this.course = ""
                 
            }
        },

      })

总结:
//跟用户交互的时候使用双向绑定vmodel
//监听事件:v-on:keydown 或者v-on:keyup 来使用,保证数据的唯一后面加.enter回车后v-on:keydown.enter
//查看修饰符

结果;2张图可以看出来结果

 

 

class与style绑定

 

 

案例:点击选择样式

class方法:

   <style>
  .active{

       background-color: #ddd;
  }
   </style>
<!-- 列表渲染 -->
        <!-- class方式 -->
          <!-- <div v-for="c in courses" :key="c" :class="{active: selectCourse === c}"
           @click= "selectCourse = c">
                如果选到的文本和当前遍历的文本相同就给上颜色 active -->
              <!-- 用vfor来把需要的课程遍历出来 -->
              <!-- c别名相当于下面的课程 后面引用前面取得名字 -->
              <!-- {{c}}
          </div> -->

style方法:


<!-- style方式来写 -->
          <div v-for="c in courses" :key="c"
          :style="{backgroundColor: selectCourse === c ? '#ddd' : 'transparent'}"
          @click= "selectCourse = c">
           <!-- 背景用驼峰 三目运算 如果selectCourse等于当前课程 就给颜色 否则不给 -->
           
            {{c}}
         </div>

全部代码:

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>购物车</title>
   <style>
   .active{

       background-color: #ddd;
  }
   </style>
</head>
<body>
   <!-- 宿主文件 -->
   <div id="app">
     <h2 v-bind:title="student" >
         <!-- ""后面决定鼠标碰到文本显示的文字 -->
         <!-- 动态绑定标题,当鼠标碰到h2里的内容会显示标题购物车 -->
         <!-- :title="titleS" -->
         <!-- 插值文本 -->
        {{title}}
        {{student}}
     </h2>
       <!-- 用户输入 -->
       <p>
           <input v-model="course" type="text" v-on:keydown.enter="addCourse"/>
           <button @click="addCourse">新增</button>
           <!-- 1.v-on:click触发监听事件 2.@click -->
           <!-- vmodel 双向的绑定,只能绑定input text,进行数据的交互 -->
           <!-- {{course}} -->
       </p>



        <!-- 列表渲染 -->
        <!-- class方式 -->
          <!-- <div v-for="c in courses" :key="c" :class="{active: selectCourse === c}"
           @click= "selectCourse = c">
                      如果选到的文本和当前遍历的文本相同就给上颜色active -->
              <!-- 用vfor来把需要的课程遍历出来 -->
              <!-- c别名相当于下面的课程 后面引用前面取得名字 -->
              <!-- {{c}}
          </div> -->

       <!-- style方式来写 -->
          <div v-for="c in courses" :key="c"
          :style="{backgroundColor: selectCourse === c ? '#ddd' : 'transparent'}"
          @click= "selectCourse = c">
           <!-- 背景用驼峰 三目运算 如果selectCourse等于当前课程 就给颜色 否则不给 -->
           
            {{c}}
         </div>
     

   </div>
   <script src="vue.js"></script>
   <script>
   //   1.创建实例
      const app =  new Vue({
         el:'#app',
         data() {
             //数据的指定,vdata
             return {
                 
                 title: '购物车',
                 student: '炽焱',
               
                 course:'',
                 //数据
                 selectCourse:'',
                 courses:['羽毛球课','前端开发','java开发']
            }
        },
         methods: {
             //注意要用vmethods才行
             addCourse() {
                 //1。添加course到数组
                 this.courses.push(this.course)
                 //2.清空course
                 this.course = ""
                 
            }
        },

      })
   

   </script>
</body>

结果:结果也就显而易见了

 

 

 

 

 

条件渲染

案例:没有课程就显示没有课程

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>购物车</title>
   <style>
   .active{

       background-color: #ddd;
  }
   


   </style>
</head>
<body>
   <!-- 宿主文件 -->
   <div id="app">
     <h2 v-bind:title="student" >
         <!-- ""后面决定鼠标碰到文本显示的文字 -->
         <!-- 动态绑定标题,当鼠标碰到h2里的内容会显示标题购物车 -->
         <!-- :title="titleS" -->
         <!-- 插值文本 -->
        {{title}}
        {{student}}
     </h2>
       <!-- 用户输入 -->
       <p>
           <input v-model="course" type="text" v-on:keydown.enter="addCourse"/>
           <button @click="addCourse">新增</button>
           <!-- 1.v-on:click触发监听事件 2.@click -->
           <!-- vmodel 双向的绑定,只能绑定input text,进行数据的交互 -->
           <!-- {{course}} -->
       </p>

       <!-- 条件渲染 -->
       <p v-if='courses.length ===0'>没有任何课程信息</p>
       <!-- 如果课程等于0 显示没有任何课程信息 -->





        <!-- 列表渲染 -->
        <!-- class方式 -->
          <!-- <div v-for="c in courses" :key="c" :class="{active: selectCourse === c}"
           @click= "selectCourse = c">
                                                 如果选到的文本和当前遍历的文本相同就给上颜色active -->
              <!-- 用vfor来把需要的课程遍历出来 -->
              <!-- c别名相当于下面的课程 后面引用前面取得名字 -->
              <!-- {{c}}
          </div> -->

       <!-- style方式来写 -->
       <div class="course-list" v-else>
           <!-- 注意:vif 于vfor 不能够使用同一个标签 -->
           <div v-for="c in courses" :key="c"
           :style="{backgroundColor: selectCourse === c ? '#ddd' : 'transparent'}"
           @click= "selectCourse = c">
            <!-- 背景用驼峰 三目运算 如果selectCourse等于当前课程 就给颜色 否则不给 -->
             
              {{c}}
          </div>

       </div>
         
     

   </div>
   <script src="vue.js"></script>
   <script>
   //   1.创建实例
      const app =  new Vue({
         el:'#app',
         data() {
             //数据的指定,vdata
             return {
                 
                 title: '购物车',
                 student: '炽焱',
               
                 course:'',
                 //数据
                 selectCourse:'',
                 courses:['羽毛球课','前端开发','java开发']
            }
        },
         methods: {
             //注意要用vmethods才行
             addCourse() {
                 //1。添加course到数组
                 this.courses.push(this.course)
                 //2.清空course
                 this.course = ""
                 
            }
        },

      })
   

   </script>
</body>
  总结:这里用到了 v-if v-else   <p v-if='courses.length ===0'>没有任何课程信息</p>
                                <div class="course-list" v-else>
      这里注意了由于下面有v-for 且这2个判罚不能用一个类名,需要在v-for身上嵌套一个类名盒子

结果:如图所示

 

 

 

计算属性和侦听器

模板内的表达式非常便利,但是却难以维护,这个时候我们想到了计算属性和监听器

计算属性 vs 监听器

  • 侦听器更通用,理论上计算器属性能实现的侦听器也能实现

  • 处理数据的场景不同,侦听器适合,一个数据影响多个数据,计算属性是受一个数据受多个数据影响

  • 计算属性有缓存性,计算所得的值如果没有变化不好重复执行

  • 侦听器适合执行异步操作或者开销较大的情况

 

总而来说计算器,比较简洁,运用的广

侦听器,要在她能够改动多个数据的时候用更方便

 

 

 

案例:课程数量的统计

//computed:
       
     <P>
     
       <!-- 计算属性的方式 -->
       <!-- 课程总数:{{total}} -->
   
     </P>
computed: {
          //vcomputed
              total() {
                  //计算属性有缓存性:如果没有发生变化,则页面不能从新渲染
                return this.courses.length +'门'
            }
        },
        //默认情况下watch初始时不执行
      //   watch: {
      //       //监控,变化之后执行
      //       courses(newValue, oldValue) {
      //           //变化之后,之前
      //           this.totalCount = newValue.length +'门'
                 
      //       }
      //   },


//watch:
<P>
       <!-- 表达式 -->
       <!-- 课程总数:{{courses.length + '门'}} -->
       <!-- 计算属性的方式 -->
       <!-- 课程总数:{{total}} -->
       <!-- 监听器 -->
      课程总数:{{totalCount}}
     </P>
watch: {
            //必须要用带选项的watch
            courses: {
                immediate: true,//立即执行
              //   deep: true,
                handler(newValue, oldValue) {
                  this.totalCount = newValue.length +'门'
                     
                }
            }
        },

完整的代码

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>购物车</title>
   <style>
   .active{

       background-color: #ddd;
  }
   


   </style>
</head>
<body>
   <!-- 宿主文件 -->
   <div id="app">
     <h2 v-bind:title="student" >
         <!-- ""后面决定鼠标碰到文本显示的文字 -->
         <!-- 动态绑定标题,当鼠标碰到h2里的内容会显示标题购物车 -->
         <!-- :title="titleS" -->
         <!-- 插值文本 -->
        {{title}}
        {{student}}
     </h2>
       <!-- 用户输入 -->
       <p>
           <input v-model="course" type="text" v-on:keydown.enter="addCourse"/>
           <button @click="addCourse">新增</button>
           <!-- 1.v-on:click触发监听事件 2.@click -->
           <!-- vmodel 双向的绑定,只能绑定input text,进行数据的交互 -->
           <!-- {{course}} -->
       </p>

       <!-- 条件渲染 -->
       <p v-if='courses.length ===0'>没有任何课程信息</p>
       <!-- 如果课程等于0 显示没有任何课程信息 -->





        <!-- 列表渲染 -->
        <!-- class方式 -->
          <!-- <div v-for="c in courses" :key="c" :class="{active: selectCourse === c}"
           @click= "selectCourse = c">
                                                 如果选到的文本和当前遍历的文本相同就给上颜色active -->
              <!-- 用vfor来把需要的课程遍历出来 -->
              <!-- c别名相当于下面的课程 后面引用前面取得名字 -->
              <!-- {{c}}
          </div> -->

       <!-- style方式来写 -->
       <div class="course-list" v-else>
           <!-- 注意:vif 于vfor 不能够使用同一个标签 -->
           <div v-for="c in courses" :key="c"
           :style="{backgroundColor: selectCourse === c ? '#ddd' : 'transparent'}"
           @click= "selectCourse = c">
            <!-- 背景用驼峰 三目运算 如果selectCourse等于当前课程 就给颜色 否则不给 -->
             
              {{c}}
          </div>

       </div>
         
     <P>
       <!-- 表达式 -->
       <!-- 课程总数:{{courses.length + '门'}} -->
       <!-- 计算属性的方式 -->
       <!-- 课程总数:{{total}} -->
       <!-- 监听器 -->
      课程总数:{{totalCount}}
     </P>

   </div>
   <script src="vue.js"></script>
   <script>
   //   1.创建实例
      const app =  new Vue({
         el:'#app',
         data() {
             //数据的指定,vdata
             return {
                 
                 title: '购物车',
                 student: '炽焱',
               
                 course:'',
                 //数据
                 selectCourse:'',
                 totalCount:0,
                 courses:['羽毛球课','前端开发','java开发']
            }
        },
         methods: {
             //注意要用vmethods才行
             addCourse() {
                 //1。添加course到数组
                 this.courses.push(this.course)
                 //2.清空course
                 this.course = ""
                 
            }
        },
         computed: {
           //vcomputed
               total() {
                   //计算属性有缓存性:如果没有发生变化,则页面不能从新渲染
                 return this.courses.length +'门'
            }
        },
         //默认情况下watch初始时不执行
       //   watch: {
       //       //监控,变化之后执行
       //       courses(newValue, oldValue) {
       //           //变化之后,之前
       //           this.totalCount = newValue.length +'门'
                 
       //       }
       //   },
         watch: {
             //必须要用带选项的watch
             courses: {
                 immediate: true,//立即执行
               //   deep: true,
                 handler(newValue, oldValue) {
                   this.totalCount = newValue.length +'门'
                     
                }
            }
        },
      })
   

   </script>
</body>
</html>

结果:由此可见课程数是3

 

 

神奇的模板语法,不用写html内容也是可以完成效果的渲染

案例

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>购物车</title>
   <style>
  .active{

       background-color: #ddd;
  }
   


   </style>
</head>
<body>
   <!-- 宿主文件 -->
   <div id="app">
   </div>
   <script src="vue.js"></script>
   <script>
   //   1.创建实例
      const app =  new Vue({
         el:'#app',
         data() {
             //数据的指定,vdata
             return {
                 
                 title: '购物车',
                 student: '炽焱',
               
                 course:'',
                 //数据
                 selectCourse:'',
                 courses:['羽毛球课','前端开发','java开发']
            }
        },
         methods: {
             //注意要用vmethods才行
             addCourse() {
                 //1。添加course到数组
                 this.courses.push(this.course)
                 //2.清空course
                 this.course = ""
                 
            }
        },
         render(){
           with(this){
               return _c('div',{attrs:{"id":"app"}},[_c('h2',{attrs:{"title":student}},[_v("\n         "+_s(title)+"\n         "+_s(student)+"\n     ")]),_v(" "),_c('p',[_c('input',{directives:[{name:"model",rawName:"v-model",value:(course),expression:"course"}],attrs:{"type":"text"},domProps:{"value":(course)},on:{"keydown":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"enter",13,$event.key,"Enter"))return null;return addCourse.apply(null, arguments)},"input":function($event){if($event.target.composing)return;course=$event.target.value}}}),_v(" "),_c('button',{on:{"click":addCourse}},[_v("新增")])]),_v(" "),_l((courses),function(c){return _c('div',{key:c,style:({backgroundColor: selectCourse === c ? '#ddd' : 'transparent'}),on:{"click":function($event){selectCourse  =  c}}},[_v("\n             \n             "+_s(c)+"\n         ")])})],2)}
        }
       

      })
      console.log(app.$options.render);
//不是在写html,而是在写js和函数,这个模板框架的真正用处
   </script>
</body>

</html>

总结:主要用:render(){}函数来存内容
    不是在写html,而是在写js和函数,这个模板框架的真正用处
   

 

 

结果显而易见:是一样的

 

 

 

posted @ 2021-09-24 13:28  炽焱--1  阅读(126)  评论(0)    收藏  举报