npm init vite@latest myvue3 --template vue
vue 3.2.26
npm i -S element plus
//全部引入
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css';
const Vue = createApp(App);
Vue.use(ElementPlus);
npm install --save-dev sass-loader
npm install --save-dev node-sass
npm install --save-dev sass
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
// https://vitejs.dev/config/
export default defineConfig({
publicPath: './', //打包路径
css: {
//配置scss全局变量和方法
preprocessorOptions: {
scss: {
additionalData: "@use './src/assets/scss/style.scss' as *;"
}
}
},
plugins: [vue()]
});
vue2 | vue3 |
---|---|
beforeCreate | setup |
created | setup |
beforeMount | onBeforeMount |
mounted | onMounted |
beforeUpdate | onBeforeUpdate |
updated | onUpdated |
beforeDestory | onBeforeUnmount |
destoryed | onUnmounted |
import { useRoute,useRouter } from 'vue-router';
const router = useRouter();
const route = useRoute();
import {useStore} from 'vuex';
const store = useStore();
返回对象的响应式副本
注意:
reactive 返回的对象,重新赋值丢失响应式
reactive 返回的对象不可以解构
const form = reactive({
name: 'aa',
age: 20
});
const { name, age } = form; //通过解构 此时name,age会丢失响应 要想让它具有响应式 需要通过toRefs处理
const { name, age } = toRefs(form); //此时name,age具有响应
所有通过 ref 创建的数据 需要通过 xxx.value 取它的值, 在模板中无需通过.value。
可以简单地把 ref(obj) 理解为这个样子 reactive({value: obj})
import { ref } from "vue";
const count = ref(1);
console.log(cout.value); //1
import { ref } from "vue";
const root = ref(null);
onMounted(() => {
console.log(root.value) //dom元素
}),
-
{{ item }}
import { ref, reactive } from "vue";
const state = reactive({
list: [1, 2, 3, 4]
})
const refList = ref([]);
const setLiDom = (el) => {
if(el){
liItem.value.push(el);
}
};
onMounted(() => {
console.log(root.value) //Proxy {0: li, 1: li, 2: li, 3: li}
}),
const state = reactive({
foo: 1,
bar: 2
});
//目的使state对象中的foo属性保持响应式连接,修改其中一个都会同步修改那个属性
const fooRef = toRef(state, 'foo');
//toRefs常用于 es6 的解构赋值操作,保持每个属性的都为响应式
setup(){
let data = reactive({
name: '张三',
age: 18
});
return {
...toRefs(data)
}
}
通过toRaw获取到原始对象,改变原始对象的值会同时改变响应式对象的值,但不会更新视图
const foo = {}
const reactiveFoo = reactive(foo)
//reactiveFoo 和 foo 是引用的同一个地址
console.log(toRaw(reactiveFoo) === foo) // true
通过markRaw包裹的原始对象,使其永远不会转换为响应式对象,也就是说转换之后修改值并不会更新视图
const foo = markRaw({})
console.log(isReactive(reactive(foo))) // false
如果参数是一个 ref,则返回内部值,否则返回参数本身
let obj = ref({ a: 1, b: 2 });
let reult = isRef(obj) ? obj.value : obj;
//等价于
let reult = unref(obj);
setup() {
//shallowRef创建一个比ref更浅的响应式对象,改变其属性值,不会触发监听
const foo = shallowRef({
a: 1111,
b: 2222
});
setTimeout(() => {
foo.value.a = 3333;
triggerRef(foo); //需要手动触发才能改变a的值
}, 2000);
watchEffect(() => {
console.log(foo.value.a); //1111 3333
});
return {
foo
};
}
在 立即触发回调函数
使用