Vue3 基础

218 阅读2分钟

VSCode代码片段

第一步,复制自己需要生成代码片段的代码; 第二步,snippet-generator.app/ 在该网站中生成代码片段; 第三步,在VSCode中配置代码片段;

vscode代码片段过程

设置 - 用户代码片段 - html.json(HTML) - 粘贴生成的代码片段

vue 语法

v-once

  • v-once 用于指定元素或者组件只渲染一次
  • 当数据发生变化时,元素或者组件以及其所有的子元素将视为静态内容并且跳过;
  • 该指令可以用于性能优化;
  • 如果是子节点,也是只会渲染一次

v-text指令

  • 用于更新元素的 textContent <div v-text="msg"></div> 等价于 <div>{{msg}}</div>

v-pre

  • v-pre用于跳过元素和它的子元素的编译过程,显示原始的Mustache标签
  • 跳过不需要编译的节点,加快编译的速度

v-cloak

保持在元素上直到关联组件实例结束编译; 和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到组件实 例准备完毕。

v-on

修饰符

  • .stop - 调用 event.stopPropagation()。
  • .prevent - 调用 event.preventDefault()。
  • .capture - 添加事件侦听器时使用 capture 模式。
  • .self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
  • .{keyAlias} - 仅当事件是从特定键触发时才触发回调。
  • .once - 只触发一次回调。
  • .left - 只当点击鼠标左键时触发。
  • .right - 只当点击鼠标右键时触发。
  • .middle - 只当点击鼠标中键时触发。
  • .passive - { passive: true } 模式添加侦听器

参数传递

  • 如果方法本身中有一个参数,那么会默认将原生事件event参数传递进去
  • 如果需要同时传入某个参数,同时需要event时,可以通过$event传入事件。

v-for

  • v-for的基本格式是 "item in 数组
  • v-for也支持遍历对象,并且支持有一二三个参数
  1. 一个参数: "value in object";
  2. 二个参数: "(value, key) in object";
  3. 三个参数: "(value, key, index) in object";
  • v-for同时也支持数字的遍历

watch

侦听的是data中的数据 默认情况下侦听data数据本身的改变(内部侦听的改变是不能侦听的) 如:侦听data中的 msg 的变化,由msg: { name: "wx", age: 20 }改变成msg: { name: "wxwx", age: 20 }是侦听不到msg.name的变化的。

需要侦听到内部的变化需要做如下处理: 对msg做深度侦听,不在是写成函数形式,而写成对象形式

watch: {
    msg: {
      handler: function(newInfo, oldInfo) {
        console.log("侦听msg内部数据是不是变化了", msg.name);
      },
      deep: true, // 深度侦听
    }
}
methods: {
    changeMsgName() {
      this.msg.name = "wxwx"
    }
}

可以发现执行了以上代码的console,所以msg内部数据的改变有被侦听到。

watch还可以在页面渲染的时候对需要立即执行的data数据进行侦听,需要在对象中加上一个 immediate 就行

watch: {
    msg: {
      handler: function(newInfo, oldInfo) {
        console.log("newInfo", newInfo, "oldInfo", oldInfo)
      },
      deep: true, // 深度侦听
      immediate: true // 立即执行
    }
}

页面渲染时会有以上console的打印,但是 oldInfo 是 undefined。

注意:当去改变data数据中对象的内部值时,newInfo 和 oldInfo 的值都是改变后的值

通过一下方式可以拿到oldInfo(旧值)

watch: {
    "msg.name": function(newName, oldName) {
      console.log(newName, oldName);
    },
},

以上console打印 wx wxx

watch: {
    msg: {
      handler: function(newInfo, oldInfo) {
        console.log("newValue:", newInfo.name, "oldValue:", oldInfo.name);
      },
      deep: true, // 深度侦听
    }
},
methods: {
    changeMsgName() {
      this.msg.name = "wxwx";
    },
}

以上console输出的 newInfo 和 oldInfo 都是 "wxwx"

watch 实现侦听的其他方式

  1. 只侦听某个对象中的值
watch: {
    "msg.name": function(newName, oldName) {
      console.log(newName, oldName);
    },
},
  1. 使用this.$watch来侦听
created() {
    this.$watch("msg", function(newInfo, oldInfo) {
      console.log(newInfo, oldInfo);
    }, {
      deep: true,
      immediate: true
    })
}

组件化

全局组件

使用vue.createApp(App).component('组件名',{属性})

<div id="app"></div>

<template id="my-app">
    <component-a></component-a>
</template>

<template id="component-a">
    <h2>{{title}}</h2>
    <p>{{content}}</p>
</template>
const App = {
    template: "#my-app",
}

const app = Vue.createApp(App)

app.component("component-a", {
template: "#component-a",
    data() {
      return {
          title: 'a',
          content: 'componentA'
      }
    },
    methods: {},
    computed: {},
    ...
});

app.mount('#app')

局部组件

<div id="app"></div>

<template id="my-app">
    <h2>{{message}}</h2>
    <component-a></component-a>
</template>

<template id="component-a">
    <h2>我是ComponentA</h2>
</template>
const ComponentA = {
    template: "#component-a"
}

const App = {
    template: "#my-app",
    components: {
        ComponentA
    },
    data() {
        return {
          message: "Hello World"
        }
    }
}

const app = Vue.createApp(App)


app.mount('#app')