vue其他知识

计算属性

使用场景:当变量的值, 依赖其他变量计算而得来才用

特点:计算属性的依赖项发生改变的时候, 重新计算结果返回并重新缓存,如果没变化,直接从缓存取结果

注意: 计算属性也是vue数据变量, 所以不要和data里重名, 用法和data相同

语法:

computed:{
"计算属性名" (){
return "值"
}
}
<template>
  <div>
# computed 再使用时,是读取缓存 不会重复计算
    <h1>{{num}}</h1>
    <h1>{{num}}</h1>
    <h1>{{num}}</h1>
# 函数调用,进行较复杂运算时,性能就比computed差
    <h2>{{getnum()}}</h2>
    <h2>{{getnum()}}</h2>
    <h2>{{getnum()}}</h2>
    <input type="text" v-model.number="a">
    <input type="text" v-model.number="b">
  </div>
</template>
<script>
export default {
  data () {
    return {
      a:0,
      b:0
    }
  },
  computed: {
    num(){
      console.log("computed");
      return this.a+this.b
    }
  },
  methods: {
    getnum(){
      console.log("getnum");
      return this.a+this.b
    }
  }
}
</script>

计算属性完整写法

如果想直接赋值,需要使用完整写法

语法:

computed: {
    "计算属性名": {
        set(值){ 
        },
        get() {
            return "值"
        }
    }
}
<template>
  <div>
    名字
    <input type="text" v-model="full" />
  </div>
</template>
<script>
export default {
  computed: {
    // 这种函数写法其实是get的简写,问题:不能修改变量的值
    // full(){
    //   return "乌拉拉"
    // }
    // 注意:如果要对对象计算属性的值进行修改,就必须带set的完整写法,否则报错
    full: {
      get() {
        return "什么鬼";
      },
      //修改的值自动被set的形参接收
      set(val) {
        console.log(val);
      },
    },
  },
};
</script>

侦听器--watch

侦听简单数据类型

目标: 可以侦听data/computed属性值改变

语法:

watch: {
    "被侦听的属性名" (newVal, oldVal){  
    }
}
<template>
  <div>
    <input type="text" v-model="name" />
  </div>
</template>

<script>
/*
侦听器watch
作用:侦听data/computed数据值的变化
语法:
watch:{
  "被侦听的属性名"(val,oldVal){
    val:第一个参数 表示现在的值
    oldVal:第二个参数 表示原本的值
  }
}
*/
export default {
  data() {
    return {
      name: "",
    };
  },
  watch: {
    name(newval, oldval) {
      console.log("新值:", newval);
      console.log("旧值:", oldval);
    },
  },
};
</script>

侦听复杂数据类型

目标: 侦听复杂类型, 或者立即执行侦听函数

语法:

watch: {
    "要侦听的属性名": {
        immediate: true, // 立即执行
        deep: true, // 深度侦听复杂类型内变化
        //handler固定方法触发
        handler (newVal, oldVal) {
        
        }
    }
}
<template>
  <div>
    <input type="text" v-model.trim="user.name" />
    <input type="text" v-model.trim="user.age" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      user: {
        name: "哈哈",
        age: 18,
      },
    };
  },
  watch: {
    user: {
      immediate: true, //立即侦听
      deep: true, //深度侦听
      // handler固定方法触发
      handler() {
        console.log("user变化了");
      },
    },
  },
};
</script>

$refs知识

利用ref和$refs可以获取dom元素,获取组件对象,调用组件方法

<template>
  <div>
    <h1 id="h1Id" ref="h1Ref">这是一个h1标题</h1>
    <!-- 子组件 -->
    <son ref="de" />
  </div>
</template>

<script>
import son from "@/components/son.vue";
export default {
  // 注册组件
  components: {
    son,
  },
  mounted() {
    console.log(document.querySelector("#h1Id"));
    // 获取dom
    console.log(this.$refs.h1Ref);
    // 获取组件实例,可以对组件为所欲为
    // 🔔 开发经验:一般只调用组件内部的方法,不会这种方式改变组件内的数据(修改数据还用父传子,子传父的方式)
    console.log(this.$refs.de);
    // 调用组件内部的方法
    this.$refs.de.fn();
  },
};
</script>

$nextTick知识

Vue更新DOM-异步的

<template>
  <div>
    <p ref="PP">数字:{{ count }}</p>
    <button @click="btn">点击加1</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      count: 1,
    };
  },
  methods: {
    btn() {
      this.count++;
      // 以下没有办法得到最新的数据(点击后的数字)
      // DOM的更新是异步的
      // console.log(this.$refs.PP.innerHTML);
      this.$nextTick(() => {
        console.log(this.$refs.PP.innerHTML);
      });
    },
  },
};
</script>

$nextTick使用场景

点击搜索按钮, 弹出聚焦的输入框, 按钮消失

<template>
  <div>
    <input type="text" ref="II" placeholder="请输入内容" v-if="isShow" />
    <button @click="btn">点击进行搜索</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isShow: false,
    };
  },
  methods: {
    btn() {
      this.isShow = true;
      // DOM的更新是异步的
      // 所以点击后的输入还是没有焦点
      // 所以用$nextTick
      this.$nextTick(() => {
        this.$refs.II.focus();
      });
    },
  },
};
</script>

自定义指令

自定义指令也分局部注册和全局注册

全局(main.js中注册):
        Vue.directive("自定义指令名", {
          inserted(el){
            el: 表示使用指令时的标签
          }
        })

局部(组件中注册):
        directives:{
          "自定义指令名": {
            inserted(el){
              el: 表示使用指令时的标签
            }
          }
        }
<template>
  <div>
    <!-- 使用指令:v-指令名称 -->
    <!-- <input type="text" v-focus /> -->
    <!-- 使用指令:v-指令名称 -->
    <h1>我是大标题-什么颜色呢?</h1>
    <h2 v-color="'red'">我是二标题-什么颜色呢?</h2>
    <h3 v-color="myColor">我是三标题-什么颜色呢?</h3>
    <button @click="myColor = 'green'">改颜色变量</button>
    <br />
    <input type="text" v-focus />
    <input type="text" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      myColor: "pink",
    };
  },

  directives: {
    // 指令名称
    focus: {
      // 挂载到页面后触发 el
      inserted(el, binding) {
        console.log(el, binding);
        el.focus();
      },
    },
  },
};
</script>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、从输入url到浏览器呈现页面中间经历了什么? 在输入url的时候,会进行本地历史记录和标签页的查询,提供模糊查...
    林思念阅读 7,624评论 2 24
  • Vue -渐进式JavaScript框架 介绍 vue 中文网 vue github Vue.js 是一套构建用户...
    桂_3d6b阅读 4,282评论 0 0
  • vue2基础第一天 1.vue指令 实质上就是特殊的 html 标签属性, 特点: v- 开头 插值表达式 在d...
    这个名字很有品味阅读 3,647评论 0 0
  • 什么是Vue 是一套用于构建用户界面的渐进式 javascript 框架(渐进式:想用什么就用什么不必全都用) 在...
    王果果阅读 10,463评论 0 14
  • 语法糖:通过更简单易理解的语法方式,优化原语法的表达形态,增强代码的可读性,从而直接减少代码出错的机会。 VUE读...
    老杨曲线阅读 1,118评论 0 0