目录:
1.Vue3快速上手
略~
2.创建Vue3.0工程
官方文档:创建一个项目 | Vue CLI
1.使用 vue-cli 创建:
- ## 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上
- vue --version
- ## 安装或者升级你的@vue/cli
- npm install -g @vue/cli
- ## 创建
- vue create vue_test
- ## 启动
- cd vue_test
- npm run serve



2.使用 vite 创建
官方文档:快速上手 | Vue.js
vite官网:https://vitejs.cn
什么是vite?—— 新一代前端构建工具。(目前的前端构建工具是webpack)
优势如下:
开发环境中,无需打包操作,可快速的冷启动。
轻量快速的热重载(HMR)。
真正的按需编译,不再等待整个应用编译完成。
传统构建 与 vite构建对比图
- ## 创建工程
- # npm 7+, extra double-dash is needed:
- npm create vite@latest my-vue-app -- --template vue
-
- ## 进入工程目录
- cd
-
- ## 安装依赖
- npm install (或者直接写 npm i)
-
- ## 运行
- npm run dev



3.常用Composition API
拉开序幕的setup
理解:Vue3.0中一个新的配置项,值为一个函数。
setup是所有Composition API(组合API)“ 表演的舞台 ”。
组件中所用到的:数据、方法等等,均要配置在setup中。
setup函数的两种返回值:
若返回一个对象,则对象中的属性、方法, 在模板中均可以直接使用。(重点关注!)
若返回一个渲染函数:则可以自定义渲染内容。(了解)
- //1.返回一个对象
- setup() {
- let name = '柯南';
- let age = 5;
- function say() {
- alert("真相只有一个!");
- }
- return {
- name,
- age,
- say
- }
- }
- //2.返回一个渲染函数
- import {h} from 'vue'
- export default {
- name: 'App',
- setup() {
- return ()=> h('h1','米花小学') //('要在页面放的元素', '要在页面放的内容')
- }
- }
5.注意点:
尽量不要与Vue2.x配置混用
Vue2.x配置(data、methos、computed...)中可以访问到setup中的属性、方法。
但在setup中不能访问到Vue2.x配置(data、methos、computed...)。
如果有重名, setup优先。
setup不能是一个async函数,因为返回值不再是return的对象, 而是promise, 模板看不到return对象中的属性。(后期也可以返回一个Promise实例,但需要Suspense和异步组件的配合)
代码示例:
App.vue
-
我是App组件
-
一个人的信息
-
姓名:{{ name }}
-
年龄:{{ age }}
-
性别:{{ sex }}
-
a的值是:{{ a }}
-
-
-
-
-
-
-
-
-
-
-
- // import {h} from 'vue'
-
- export default {
- name: 'App',
- data() {
- return {
- sex: '男',
- a: 100
- }
- },
- methods: {
- sayWelcome() {
- alert('欢迎学习vue3')
- },
- test1() {
- console.log(this.sex)
- console.log(this.name)
- console.log(this.age)
- console.log(this.sayHello)
- console.log(this.sayWelcome)
- }
- },
- setup() {
- let name = '张三'
- let age = 18
- let a = 200
-
- function sayHello() {
- alert(`我叫${name},我${age}岁了,你好啊!`)
- }
-
- function test2() {
- console.log(name)
- console.log(age)
- console.log(sayHello)
- console.log(this.sex)
- console.log(this.sayWelcome)
- }
-
- //返回一个对象(常用)
- return {
- name,
- age,
- sayHello,
- test2,
- a
- }
-
- //返回一个函数(渲染函数)
- //写法一
- // return () => {
- // return h('h1', '渲染函数')
- // }
-
- //写法二
- // return () => h('h1', '渲染函数')
-
- }
- }
-
-
ref函数
作用: 定义一个响应式的数据(让vue3能检测到它的改变)
引入:import {ref} from 'vue'(Vue3的一个特点就是要用啥引入啥)
语法: const xxx = ref(initValue)
创建一个包含响应式数据的引用对象(reference对象,简称ref对象)。
ref(xxx)将xxx包装成了RefImpl(reference引用 implement实现)构造函数的实例对象,也就是ref对象
JS中操作数据: xxx.value
模板中读取数据: 不需要.value,直接:
备注:
接收的数据可以是:基本类型、也可以是对象类型。
基本类型的数据:响应式依然是靠Object.defineProperty()的get与set完成的。
对象类型的数据:内部 “ 求助 ” 了Vue3.0中的一个新函数——reactive函数。于是xxx.value就是proxy对象
代码示例:
App.vue
-
我是App组件
-
一个人的信息
-
姓名:{{ name }}
-
年龄:{{ age }}
-
-
- import {ref} from 'vue'
-
- export default {
- name: 'App',
- setup() {
- let name = ref('张三')
- let age = ref(18)
-
- function changeInfo() {
- name.value = '李四'
- age.value = 48
- console.log(name, age)
- }
-
- return {
- name,
- age,
- changeInfo
- }
- }
- }
-
-
升级一下:
-
我是App组件
-
一个人的信息
-
姓名:{{ name }}
-
年龄:{{ age }}
-
工作种类:{{ job.type }}
-
工作薪水:{{ job.salary }}
-
-
- import {ref} from 'vue'
-
- export default {
- name: 'App',
- setup() {
- let name = ref('张三')
- let age = ref(18)
- let job = ref({
- type: '前端工程师',
- salary: '30K'
- })
-
- function changeInfo() {
- name.value = '李四'
- age.value = 48
- job.value.type = 'UI设计师'
- job.value.salary = '60K'
- console.log(name, age)
- }
-
- return {
- name,
- age,
- changeInfo,
- job
- }
- }
- }
-
-
reactive函数
作用: 定义一个对象类型的响应式数据(基本类型不要用它,要用ref函数)
引入:import {reactive} from 'vue'
语法:const 代理对象= reactive(源对象)接收一个对象(或数组),返回一个代理对象(Proxy的实例对象,简称proxy对象)
reactive定义的响应式数据是“深层次的”。
内部基于 ES6 的 Proxy 实现,通过代理对象操作源对象内部数据进行操作。
这里数组也能直接通过下标操作数据且vue能监测到,而vue2里不能
代码示例:
App.vue
-
我是App组件
-
一个人的信息
-
姓名:{{ name }}
-
年龄:{{ age }}
-
工作种类:{{ job.type }}
-
工作薪水:{{ job.salary }}
-
测试的数据c:{{ job.a.b.c }}
-
爱好:{{ hobby }}
-
-
- import {ref, reactive} from 'vue'
-
- export default {
- name: 'App',
- setup() {
- let name = ref('张三')
- let age = ref(18)
- let job = reactive({
- type: '前端工程师',
- salary: '30K',
- a: {
- b: {
- c: 666
- }
- }
- })
- let hobby = reactive(['抽烟', '喝酒', '烫头'])
-
-
- function changeInfo() {
- name.value = '李四'
- age.value = 48
- // job.value.type = 'UI设计师'
- // job.value.salary = '60K'
- job.type = 'UI设计师'
- job.salary = '60K'
- job.a.b.c = 999
-
- hobby[0] = '唱'
- hobby[1] = '跳'
- hobby[2] = 'rap'
- console.log(name, age)
- console.log(job)
- }
-
- return {
- name,
- age,
- changeInfo,
- job,
- hobby
- }
- }
- }
-
-
升级一下:
-
我是App组件
-
一个人的信息
-
姓名:{{ person.name }}
-
年龄:{{ person.age }}
-
工作种类:{{ person.job.type }}
-
工作薪水:{{ person.job.salary }}
-
测试的数据c:{{ person.job.a.b.c }}
-
爱好:{{ person.hobby }}
-
-
- import {ref, reactive} from 'vue'
-
- export default {
- name: 'App',
- setup() {
- let person = reactive({
- name: '张三',
- age: 18,
- job: {
- type: '前端工程师',
- salary: '30K',
- a: {
- b: {
- c: 666
- }
- }
- },
- hobby: ['抽烟', '喝酒', '烫头']
- })
-
-
- function changeInfo() {
- person.name = '李四'
- person.age = 48
- person.job.type = 'UI设计师'
- person.job.salary = '60K'
- person.job.a.b.c = 999
- person.hobby[0] = '唱'
- person.hobby[1] = '跳'
- person.hobby[2] = 'rap'
- }
-
- return {
- person,
- changeInfo,
- }
- }
- }
-
-
vue2.x的响应式
实现原理:
对象类型:通过Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。
数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。
Object.defineProperty(data, 'count', {
get () {},
set () {}
}) 存在问题:
新增属性(.)、删除属性(delete), 界面不会更新。(需用$set/$delete或Vue.set/Vue.delete)
直接通过下标修改数组, 界面不会自动更新。(需用$set或Vue.set或splice())
代码示例:
-
-
我是Vue2写的效果
-
"person.name">姓名:{{ person.name }}
-
年龄:{{ person.age }}
-
"person.sex">性别:{{ person.sex }}
-
爱好:{{ person.hobby }}
-
-
-
-
-
- import Vue from 'vue'
-
- export default {
- name: 'App',
- data() {
- return {
- person: {
- name: '张三',
- age: 18,
- hobby: ['学习', '吃饭']
- }
- }
- },
- methods: {
- addSex() {
- this.person.sex = '女'
- // this.$set(this.person, 'sex', '女')
- // Vue.set(this.person, 'sex', '女')
- },
- deleteName() {
- delete this.person.name
- // this.$delete(this.person, 'name')
- // Vue.delete(this.person, 'name', '女')
- },
- updateHobby() {
- this.person.hobby[0] = '逛街'
- // this.$set(this.person.hobby, 0, '逛街')
- // this.person.hobby.splice(0, 1, '逛街')
- }
- }
- }
-
-
vue2的响应式原理:
- "en">
- <head>
- "UTF-8">
-
Title