引入的是一个名为createApp的工厂函数(无需通过new关键字来新建)
app类似于原来的vm,但app比vm更轻
mount 为挂载,只有挂载后才会显示 unmount为卸载 作用相反
vue3中的模板结构可以没有根标签
setup
setup是所有组合式api的基础,组件中红所用的数据方法等都要配置在setup中,无需再写data methods等。(个人觉得就有点像普通的js作用域,无需分类啥的)
两种返回值: 1若返回值为对象,可以在模板里面直接使用。
2若返回一个渲染函数,可以自定义渲染函数 此时模板就会不好使了,渲染函数为主
vue3中的数据可以在vue2中调用,反之不可以,如果数据出现冲突 以vue3为主 也就是 setup优先。
setup 不可以使用 async 进行修饰, 因为使用该字符进行修饰就会返回一个promise对象,就返回不出去了
ref函数:
vue2中的ref就是打标识
vue3中的ref是一个函数,通过该函数进行加工后的变量变为了RefImpl的实例对象。(引用实现对象、引用对象)
import {ref} from 'vue'
let name = ref('李四')
name.value = '张三'
这样才会把数据绑定上
在模板里面不用使用value属性,因为vue3发现ref对象时,会自动调用value值
对于将对象实例为ref对象时,ref对象里面就不用在调用value了
ref对于基本类型数据是使用refimpl来实现的(getter,setter),但是对于引用对象(使用数据劫持实现,Proxy加工为代理对象),使用了vue3中reactive函数。
reactive:定义一个对象类型的响应式对象
总结:绑定响应式对象的时候 基本类型用ref 对象类型用reactive
响应式原理:
为什么要用reavtive呢,因为如果要对对象内部数据进行操作的时候,如果是vue2需要调用api进行实现,这样的话界面才会更新
window.proxy
const p = new Proxy(person ,{此处需要占位 })
·通过Proxy(代理):拦截对象中任意属性的变化,包括:属性值的读写、属性的添加、属性的删除等。
·通过Reflect(反射):对源、对象和的属性进行操作
ref 和 reactive对比
从定义数据的角度:
· ref用来定义基本类型数据
· reactive用来定义对象类型数据
· ref也可以定于对象类型数据,它内部会通过reative转为代理对象
从原理角度:
·ref通过Object.defineProperty() 的get 与 set 实现(数据劫持)
·reactive通过使用Proxy来实现响应式(数据劫持),并通过Reflect操作源对象内部数据
从使用角度对比:
·ref定义的数据:操作数据需要 .value , 读取数据模板中直接读取不需要 .value
·reactive定义的数据:操作数据与读取数据都不需要.value
setup的注意点:
·setup的执行时机:在beforecreate之前执行一次。this为undefined,在setup中不可以写this
·setup可以接收的参数:
1--->props
父组件往子组件发送的数据,
2--->context
里面有 attrs(数据捡漏)、emit(自定义时间)、slots(插槽)