vue2 基本使用

1.模板

2.computed 和 watch

3.class 和 style

4.条件

5.循环

6.事件

7.表单

 

一、模板

  • 插值、表达式
      •  
        <template>
          <div>  
        p>文本插值 {{message}}</p> <p> js 表达式 {{flag: 'yes' : 'no'}} (只能是表达式,不能是 js语句)</p>
        </div>
        </template> export default(){ data(){ return { message:'hello vue',    flag: true } } }
           
  • 属性
      • data: 定义组件的初始数据
      • props: 传递数据给子组件
      • computed: 定义计算属性
      • methods: 定义组件的方法
      • watch: 监听组件的数据变化
      • components: 注册子组件。将其他组件注册为当前组件的子组件,从而在模板中使用这些子组件    
  • 指令: 
      • v-if: 条件渲染指令,根据表达式的真假来决定是否渲染该元素
      • v-show: 条件显示指令,根据表达式的真假来决定元素的显示和隐藏  
      • v-for: 列表渲染指令,根据数据源循环渲染列表元素
      • v-bind: 属性绑定指令, 动态绑定属性
      • v-on: 事件绑定指令,用于监听 DOM事件,并执行对应的方法
      • v-model: 数据双向绑定指令,用于在表单和vue实例的数据之间建立双向绑定关系
      • v-text: 文本插值指令,将数据插入到元素的文本内容中
      • v-html: HTML 插值指令,将数据作为HTML解析并插入到元素中。会有XSS 风险,会覆盖 

二、computed 和 watch

  1.computed 介绍

      • computed 用来监控自己定义的变量,该变量在data 内没有声明,直接在computed中定义。
      • computed 中定义的属性值对象时,那么对象中会定义一个get 方法和 一个set 方法,获取时调用get方法,数据变化时调用set方法
      • computed 中定义的属性值函数时,那么默认会走get方法,必须要有一个返回值,函数的返回值就是该属性的属性值
      • computed 中定义的属性值会被缓存,只有当依赖数据发生变化时才会重新计算,这样可以避免重复计算提高性能(当页面中多处引用时,只要值不变就会直接从缓存中获取结果,不会重新计算)
<template>
     <div>
            <p>{{perName}}</p>
<p>{{perName}}</p>
       <button @click="onClick>点击</button> </div> </template>
<script> export default { data(){ per:{ name: '张三', age: 18 } },
  methods:{
onClick(){
this.perName = 'lisi'
}
}, computed: {
      // 属性值是函数的情况 perName(){
console.log('1111') //只执行一次
return this.per.name //是函数时必须有return },
      // 属性值是对象的时候,设置get 和 set方法
      perName:{
get(){ //读取时候调用
this.per.name
},
       set(newVal){ //设置的时候调用
           this.per.name = newVal
}
} } }
</script>

  2. watch 介绍

      • watch 是检测data 内声明的数据。
      • watch 监听简单数据,可以获得新旧两个值
      • watch 检听对象时,需要使用深度监听,此时拿到的新旧两个值时一样的(因为他们存储的指针地址是同一个)。所以深度监听可以检测到数据变化但不能检测到哪个属性发生了变化
      • watch 监听props 组件传过来的值时,第一次加载页面时不会执行,需要设置immediate:true 会在第一次加载时执行      
<template>
  <div class="hello">
     <p>{{per.name}}</p>
     <button @click="onclick">按钮</button>
  </div>
</template>

<script>
export default {
  data () {
    return {
      per:{
        name:'zhangsan',
        age: 19
      }
    }
  },
  methods:{
    onclick(){
      this.per.name = 'zhangsan2'
    },
  },
  watch:{
   //监听对象某个属性
'per.name': function(newVal,oldVal) { console.log(newVal,'newVal') console.log(oldVal,'oldVal') },
  //监听整个对象,需要深度监听 per:{ handler(newVal,oldVal){ console.log(newVal,oldVal)
//是对象类型的数据时,检测不到之前的数据,即newVal 和 oldVal 相等。因为这两个值存储的地址相同 }, deep: true, //深度监听 immediate: true //组件加载时,会立即出发回调函数(即第一次加载时就会触发,默认第一次不会触发) } } } </script>

 

  3.二者区别:

      • computed  是计算属性;而 watch 是监听,并且监听的是 data 中的数据 或者 props传过来的数据
      • computed 不支持异步; 而 watch 支持异步操作 
      • computed 支持缓存,依赖的属性值发生变化,计算属性才会重新计算,否则用缓存(所以计算新的属性值时不会用method,method中定义的方法没有缓存,页面上引用几次就出触发几次函数执行。)。
      • computed 第一次加载就监听;watch 第一次不监听(除非设置immediate:true,第一次才会监听)
      • computed 属性值是函数时,必须有return。而watch 不用
      • 当一个属性受多个属性影响的时候,使用computed(一对多),例如:购物车结算(total = count * price)
      • 当一条数据影响多条数据的时候,使用watch(多对一),例如:搜索框     

三、class 和 style

  class:

    • 对象语法
        •  
          <div class="static" :class="{'active': isActive,'text-danger':hasError}"></div>
          <div :class="classObject"></div> <script> export default { data(){ return { isActive: true, hasError: false,
          classObject: {
          active: true,
          'text-danger': false
          }
          } } } </script>
              
    • 数组语法 
          • <div class="static" :class="[activeClass,errorClass]"></div>
            <!--数组中可以使用三元表达式,对象中不可以使用三元表达式-->
            <div :class="[isActive? activeClass : '', errorClass]"></div>
            <!--- 数组中也可以使用对象-->
            <div :class="[{'active': isActive} , errorClass]"></div>
            <script>
             export default {
                   data(){
                       return {
                             activeClass:'active',
                             errorClass:'text-danger',
               isActive: true } } }
            </script>
                       

  style:

    1. 绑定对象:

<div class="static" :style="{'color': activeColor, fontSize: '12px'}"></div>
<!--数组中可以使用三元表达式,对象中不可以使用三元表达式-->
<div :style="styleObject"></div>
<script>
 export default {
       data(){
           return {
                 activeColor:'red',
              styleObject:{color: red,'font-size': 12px}
            }
      }
}
</script>

 

    2. 绑定数组: 多个样式对象可以用数组形式

<div class="static" :style="[baseStyle,styleObject"></div>
<script>
 export default {
       data(){
           return {
                 activeColor:'red',
              styleObject:{color: red,'font-size': 12px},
                  baseStyle: { fontSize: 16px;}
            }
      }
}
</script>

 

四、条件

    • v-if:  指令的表达式返回真时才渲染
    • v-else:搭配v-if,为v-if 添加一个 else区块
    • v-else-if: 提供的时相应于 v-if 的 else if 区块。
    • v-show:按条件显示一个元素

    v-if 与 v-show 区别: 

        • v-if 只有在条件为true时才会被渲染,切换时,条件区块内的事件监听和组件都被销毁与重建
        • v-show 无论条件真假都会被渲染,切换时只是css中的display 被切换(显示/隐藏) 
        • v-if 切换开销比较高,而v-show 初始渲染开销高。所以,频繁切换则使用v-show,如果条件很少改变则使用v-if            

五、循环

  v-for:

      • 可以遍历数组 或者 对象的所有属性
      • v-for 可以接受一个整数值n,取值范围是 1 ~ n ,而不是0 ~ n
        <span v-for="n in 10">{{n}}</span>
        <!--- 此处的n 初始值是 1 而不是 0-->

         

  v-for 与 v-if 为什么不推荐在同一个节点上使用:   

      • 在 vue2 中,v-for 的优先级高于 v-if
      • 在 vue3 中,虽然 v-if 优先级高于 v-for,但官方仍不见一同一个元素使用,                           

六、事件

    • v-on (简写 @)
    • 事件修饰符:以 . 开头的指令后缀
      • .stop 停止事件传递(阻止冒泡) 
      • .prevent 阻止事件的默认行为
      • .capture 使用事件捕获模式
      • .self 只当事件在该元素本身触发时触发回调
      • .once 事件只触发一次
      • .passive 使得滚动等事件的默认行为立即执行,不等待事件回调完成 

七、表单

  v-model: 是一个语法糖,实际上是一个双向绑定。v-model 可以用在不同类型的输入input、textarea、select。

  实现v-model 的核心:1)使用value 属性创建一个双向绑定;2)监听input 事件以更行数据    

      • <input> 和 <textarea> 会绑定value 属性 并且 侦听 input 事件
        <input v-model="text">
        <!--- v-model 手动实现, 上面的写法等价于下面的写法-->
        <input :value="text" @input="updateText">
        
        export default{
            data:{
                 text:''
            },
            methods:{
                updateText(event){
                       this.text = event.target.value
                 }
            }
        }  
        
          
        • <input type="checked"> 和 <input type="radio"> 会绑定 checked 属性,并监听 change 事件

        • <select> 会绑定 value 属性 ,并监听 change事件

   修饰符:

      • .lazy :
        <!-- 在 "change" 事件后同步更新而不是 "input", 用作防抖 -->
        <input v-model.lazy="msg" />
      • .number :
        <!--让用户输入自动转换为数字,你可以在 v-model 后添加 .number 修饰符来管理输入-->
        <input v-model.number="age">
      • .trim:
        <!--自动去除用户输入内容中两端的空格-->
        <input v-model.trim="msg" />

         

                 

      

posted @ 2025-01-08 15:07  yangkangkang  阅读(141)  评论(0)    收藏  举报