一般都返回一个对象:为模板提供数据,也就是模板中可以直接使用此对象中的所有属性/方法
返回对象中的属性会与data函数返回对象合并成为组件对象的属性
返回对象中的方法会与methods中的方法合并成功组件对象的方法
{{msg}}
{{obj.name}}
{{obj.age}}
{{item}}

若返回一个渲染函数,则可以自定义渲染内容

注意:
尽量不要和Vue2.x配置混用
Vue2.x配置(data,methods,computed…)中可以访问setup中的属性,方法
但在setup中不能访问到Vue2.x配置(data,methods,computed…)
如有重名,setup优先
setup不能是一个async函数,因为返回值不再是return的对象,而是Promise,模板看不到return对象中的属性
给script标签直接添加setup属性就能使用setup了
{{msg}}
{{obj.name}}
{{obj.age}}
{{item}}

这意味着与普通的
App组件中

ref设计原理:监听value的改变,劫持value属性的get和set
因此ref一般用在基本数据,或者引用数据的嵌套层级不深的数据上
嵌套层级深情况用reactive;
案例:
{{count}}
{{obj.name}}--{{obj.age}}
{{item}}

{{obj.name}}----{{obj.age}}
{{item.relation}}----{{item.age}}

vue2.0的响应式
实现原理
对象类型:通过Object.definedProperty()对属性的读取、修改进行拦截(数据劫持)
数组类型:通过重写更新数据的一系列方法来实现拦截。(对数组的方法进行了包裹)
存在问题:
新增属性,删除属性都不会刷新界面
直接通过下标修改数组,界面不会自动更新
vue3.0的响应式
Vue3中的计算属性跟Vue2作用一样,只是写法不同,它变成了一个组合式API
引入
import {reactive,computed} from "vue"
使用
let count= computed(function,变量) //第一个参数为执行的业务函数,第二个参数为可以指定哪个发生变化就会执行,默认为业务函数中计算用到的所有变量
案例:
{{item.title}}--单价:{{item.price}}--数量:{{item.count}}
总价:{{count}}

案例一:实现输入框的下拉菜单
{{el}}
//点击时将input内容变为el

案例二:实现秒表倒计时,当为零时结束
倒计时:{{time}}

在Vue3.x中,新增了一个setup生命周期函数,setup执行的时机是在beforeCreate生命函数之前执行,因为在这个函数中不能通过this来获取实例的;同时为了命名的统一,将beforeDestory改名为beforeUnmount,destoryed改名为unmounted
在选项式中生命周期函数有
beforeCreate(建议使用setup代替)created(建议使用setup代替)
setup
beforeMount mounted
beforeUpdate updated
beforeUnmount unmounted
再组合式中,也就是setup语法糖中有:
通过在生命周期函数前加on来访问组件的生命周期
注意点就是必须用import引入
onBeforeMount onMounted
onBeforeUpdate onUpdated
onBeforeUnmount onUnmounted
onErrorCaptured
onRenderTracked
onRenderTriggered
Vue 鼓励我们通过将 UI 和相关行为封装到组件中来构建 UI。我们可以将它们嵌套在另一个内部,以构建一个组成应用程序 UI 的树。
然而,有时组件模板的一部分逻辑上属于该组件,而从技术角度来看,最好将模板的这一部分移动到 DOM 中 Vue app 之外的其他位置
模态弹框
to属性:放到指定位置

vue3组件内部组合式API setup中取属性值
子组件box中
{{pro}}===={{count}}
setup语法糖中获取属性值
子组件Box3中
{{obj.pro}}==={{obj.count}}
//父组件中
父组件Box2内部

再setup函数中引入ctx,这个就是相当于this对象,ctx上有emit方法用来触发事件
box2子组件中
再setup语法糖中引入defineEmits方法,传入数组,数组里面则是父组件传递的自定义事件名
box3子组件中
Vue3中v-model双向绑定的变化:
v-model可以多个绑定
prop 和事件默认名称已更改:
prop属性:value 变为-> modelValue;
event事件:input 变为-> update:modelValue;
案例:
box4子组件中
父组件传递的数据---{{a}}--{{b}}--{{c}}
//父组件中
父组件box1内部
V-model--父组件str的值---{{a}}--{{b}}--{{c}}
{{item}}

单文件组件的 标签可以通过 v-bind 这一 CSS 函数将 CSS 的值关联到动态的组件状态上
案例:点击随机切换字体颜色
随机字体颜色

1.选项式组件内部注册跟vue2一样
2.vue3组件内部组合式API setup语法糖中注册组件
< /template>
3.注册全局组件
//main.js文件:
import { createApp} from 'vue'
import App from './App.vue'
const app=createApp(App)
import Box1 from "./Box5.vue"
app.component(Box1.name,Box1)
app.mount('#app')//注意 一定要在app.mount之前注册全局组件 否则使用不了
4.定义同步组件:
//再box2组件内部
5.1定义局部异步组件 再setup语法糖中:: 引入defineAsyncComponent 也可再组件内部导出,跟第四步一样
5.2定义全局异步组件:
//main.js文件:
import { createApp,defineAsyncComponent} from 'vue'
import App from './App.vue'
const app=createApp(App)
let Box1=defineAsyncComponent(()=>import("./Box4.vue"))
app.component("Box1",Box1)
app.mount('#app')//注意 一定要在app.mount之前注册全局组件 否则使用不了
等待异步组件时渲染一些额外的内容,让应用有更好的用户体验
default 插槽里的节点会尽可能展示出来。如果不能,则展示 fallback 插槽里的节点。
正在加载中Loading...
isRef 判断是否为响应性变量
toRef 把引用数据的属性值设置为变量 并且关联和设置为响应性变量
toRefs 引用数据响应式解构
readonly 把数据变为只读功能
验证是否为响应式数据:{{fn()}}
验证只读数据:{{str2}}
toRef验证:{{age}}---{{obj.age}}
toRefs验证: name-age:{{name}}-{{count}}---obj:{{obj.name}}-{{obj.count}}
