<template>
<h1>Apph1>
<p>supermanp>
template>
<script>
export default { name: "App" };
script>
to 属性,属性值为 选择器,以指定移动到的位置默认情况下,子组件的 HTML 结构会显示到父组件的 HTML 结构里面;
使用 Teleport 标签包裹子组件的 HTML 标签,则能将该 HTML 结构显示到指定的位置
<template>
<div class="box">
<h1>Apph1>
<button @click="bol = !bol">显示 / 隐藏button>
<Son v-if="bol" />
div>
template>
<script>
import { ref } from "vue";
import Son from "./components/Son.vue";
export default {
name: "App",
components: { Son },
setup() {
let bol = ref(false);
return { bol };
},
};
script>
<style>
.box {
width: 200px;
height: 200px;
background: palevioletred;
position: relative;
}
style>
<template>
<h2>Sonh2>
<Teleport to="body">
<h2>Teleport Sonh2>
Teleport>
template>
<script>
export default { name: "Son" };
script>
default 插槽的内容:为异步引入的组件fallback 插槽的内容:为加载时显示的内容<template>
<div class="box">
<h1>Apph1>
<Suspense>
<template v-slot:default>
<Son>Son>
template>
<template #fallback>
加载中...
template>
Suspense>
div>
template>
<script>
// 静态引入
// import Son from "./components/Son.vue";
// 异步引入
import { defineAsyncComponent } from 'vue';
const Son = defineAsyncComponent(() => import("./components/Son.vue"));
export default {
name: "App",
components: { Son },
};
script>
<template>
<h2>Son: {{ p }}h2>
template>
<script>
export default {
name: "Son",
// 此时 setup 也可以是 async 函数
async setup() {
let p = await new Promise((resolve, reject) => {
setTimeout(() => {
resolve("superman")
}, 1000);
});
return { p };
}
};
script>
Vue2
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
Vue.config.productionTip = false
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
Vue3
createApp:
createApp 返回:应用实例对象 (相当于 Vue2 中的 vm,但比 vm 轻)createApp 之后链式调用其它方法import { createApp } from 'vue' // 引入 createApp 方法
import App from './App.vue'
import router from './router'
import store from './store'
createApp(App).use(store).use(router).mount('#app') // 链式调用
Vue2
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {},
mutations: {},
actions: {},
modules: {}
})
Vue3
import { createStore } from 'vuex' // 引入 createStore 方法
export default createStore({
state: {},
mutations: {},
actions: {},
modules: {}
})
Vuex 的使用
import { createStore } from 'vuex'
export default createStore({
state: {
name: "superman",
arr: [1, 2, 3]
},
mutations: {
muModify(state, val) {
console.log("commit muModify", val)
state.name += val
}
},
actions: {
acModify(context, val) {
console.log("dispatch acModify", val)
context.commit("muModify", val)
}
},
getters: {
getArr(state) {
return state.arr.map(item => item * 2)
}
},
modules: {}
})
useStore 方法使用 vuex<template>
<p>普通使用:p>
<p>$store.state.name: {{ $store.state.name }}p>
<p>$store.state.arr: {{ $store.state.arr }}p>
<p>$store.getters.getArr: {{ $store.getters.getArr }}p>
<hr />
<p>Vue 3:p>
<p>name: {{ name }}p>
<p>arr: {{ arr }}p>
<p>getArr: {{ getArr }}p>
<hr />
<button @click="coModify">coModify namebutton> |
<button @click="diModify">diModify namebutton>
template>
<script>
import { useStore } from "vuex";
export default {
name: "App",
setup() {
// 通过 useStore 使用 Vuex
const store = useStore();
// 获取数据
let name = store.state.name;
let arr = store.state.arr;
let getArr = store.getters.getArr;
// 调用 dispatch 方法
function diModify() {
store.dispatch("acModify", "(Actions)");
}
// 调用 commit 方法
function coModify() {
store.commit("muModify", "(Mutations)");
}
return { name, arr, getArr, coModify, diModify };
},
};
script>
computed 方法使用let name = computed(() => store.state.name);
let arr = computed(() => store.state.arr);
let getArr = computed(() => store.getters.getArr);
Vue2
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
Vue.use(VueRouter)
const routes = [{
path: '/',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: () => import('../views/About.vue')
}
]
const router = new VueRouter({
mode: 'history', // 设置路由模式为 history
base: process.env.BASE_URL, // 根据 webpack 环境,设置 [根路径]
routes
})
export default router
Vue3
import {
createRouter, // 引入 createRouter 方法
createWebHistory // 引入 createWebHistory 方法
} from 'vue-router'
import Home from '../views/Home.vue'
const routes = [{
path: '/',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: () => import('../views/About.vue')
}
]
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes
})
export default router
vue-router 的使用
import {
createRouter,
createWebHistory
} from 'vue-router'
import Home from '../views/Home.vue'
const routes = [{
path: '/',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: () => import('../views/About.vue')
}
]
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes
})
export default router
useRoute 方法使用 vue-router<template>
<router-link to="/">Homerouter-link> |
<router-link to="/about">Aboutrouter-link>
<router-view />
template>
<script>
export default {
name: "App",
};
script>
<template>
<h1>Abouth1>
template>
<script>
import {
useRoute,
useRouter,
onBeforeRouteLeave,
onBeforeRouteUpdate,
} from "vue-router";
export default {
name: "About",
setup() {
// 当前路由对象
let route = useRoute();
console.log("route", route);
// 总路由对象
let router = useRouter(router);
console.log("router", router);
// 路由守卫
onBeforeRouteLeave(() => {
console.log("onBeforeRouteLeave:离开路由时触发");
});
onBeforeRouteUpdate(() => {
console.log("onBeforeRouteUpdate:复用路由时触发");
});
return {};
},
};
script>
<template>
<h1>Homeh1>
template>
<script>
export default { name: "Home" };
script>
import { nextTick } from 'vue'
nextTick(() => {
// 一些和DOM有关的东西
})
Vue.XXX → app.XXX
Vue2 -
Vue.directive("自定义指令名", 配置对象)
import Vue from 'vue'
import App from './App.vue'
Vue.config.productionTip = false
Vue.directive("focus", {
bind() {
console.log("指令与元素绑定时触发");
},
inserted(el) {
console.log("指令所在元素插入页面时触发");
el.focus();
},
update(el) {
console.log("模板重新渲染时触发");
el.focus();
}
});
new Vue({ render: h => h(App) }).$mount('#app')
Vue.directive("focus", (el, msg) => {
console.log(el, msg); // el:挂载的元素;val:挂载的信息
console.log(msg.value); // 获取指令的属性值
});
Vue3 -
app.directive("自定义指令名", 配置对象)
import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)
// 自定义指令,指令具有一组生命周期钩子:
app.directive('myIns', {
// 在绑定元素的 attribute 或事件监听器被应用之前调用
created() {},
// 在绑定元素的父组件挂载之前调用
beforeMount() {},
// 在绑定元素的父组件挂载之后调用
mounted() {},
// 在包含组件的 VNode 更新之前调用
beforeUpdate() {},
// 在包含组件的 VNode 及其子组件的 VNode 更新之后调用
updated() {},
// 在绑定元素的父组件卸载之前调用
beforeUnmount() {},
// 在绑定元素的父组件卸载之后调用
unmounted() {}
});
app.mount('#app')
钩子函数接收 2 个参数:
el:指令绑定到的元素,可用于直接操作 DOM。eg:el.focus()binding:配置对象
instance:使用指令的组件实例value:传递给指令的值oldValue:先前的值,仅在 beforeUpdate 和 updated 中可用。无论值是否有更改都可用arg:传递给指令的参数(如果有的话)v-my-directive:foo 中,arg 为 "foo"。modifiers:修饰符对象(如果有的话)v-my-directive.foo.bar 中,修饰符对象为 {foo: true,bar: true}dir:配置对象本身Vue2 -
Vue.prototype
import Vue from 'vue'
import App from './App.vue'
Vue.config.productionTip = false
Vue.prototype.$myData = "superman" // 设置全局属性
new Vue({ render: h => h(App) }).$mount('#app')
Vue3 -
app.config.globalProperties
import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)
app.config.globalProperties.$myData = "superman" // 设置全局属性
app.mount('#app')