{{ name }}
{{ showName() }}
{{ way }}
Vue2
way:{{ way }}
showName():{{ showName() }}
Vue3
name:{{ name }}
showWay():{{ showWay() }}
{{ name }}
{{ showName() }}
setup 在 beforeCreate 之前执行,此时的 this 是 undefined
此时想在 setup 获取 this,可以通过事件异步获取
father:{{ faMsg }}
son:{{ sonMsg }}
props
对象是响应式的,就是说,传入新的 props 时,会对其进行更新props
对象,这样的话,会使其失去响应性(但我试了还是响应式的)setup({ sonMsg }) {
console.log("sonMsg", sonMsg); // superman
},
attrs
、slots
、emit
分别等同于 $attrs
、$slots
和 $emit
实例 property
attrs
属性:用于接收父组件传递给子组件的数据
如果组件没有设置 props 属性接收父组件传递的数据,则 context 的 attrs 属性会接收,反之则不接收
父组件传递过来的数据:{{ msg }}
emit
:用于设置自定义事件,实现子组件到父组件的数据传递
父组件的数据:{{ msg }}
expose
方法:用于暴露子组件的数据给父组件
sonMsg:{{ sonMsg }}
|
faMsg:{{ faMsg }}
faMsg.sonMsg:{{ faMsg.sonMsg }}
faMsg.value.sonMsg
,因为 setup 方法在 beforeCreate 之前执行,此时在 setup 方法内的 this 还是 undefined,元素也尚未挂载,所以尚未能获取 faMsg.value.sonMsg
的值
faMsg:{{ faMsg }}
faMsg.sonMsg:{{ faMsg.sonMsg }}
slots
:用于获取插槽信息
插槽内容
{{ msg }}
setup 中的钩子函数
{{ msg }}
其实就是把函数封装成一个文件,在需要的地方使用,实现代码的复用
使 setup 中的逻辑代码更简洁清晰
import {
onMounted,
ref
} from "vue"
// 导出函数 modifyColor
export function modifyColor() {
// 定义数据
let coArr = ["pink", "paleGreen", "brown", "burlyWood"];
let num = 0;
let color = ref("pink");
// 定义方法
function changeColor() {
num++;
color.value = coArr[num % 4];
}
// 导出数据、方法
return {
color,
changeColor,
}
};
// 导出函数 winClick
export function winClick() {
// window 绑定的事件
function handleClick() {
console.log("通过 onMounted 绑定的事件");
}
// 销毁事件
function removeClick() {
window.removeEventListener("click", handleClick)
}
// 生命周期
onMounted(() => {
window.addEventListener("click", handleClick)
})
// 导出数据
return removeClick
}
app的内容
app的内容
provide
用于传递数据给后代组件:provide("数据名", 数据值)
inject
用于接收祖先组件传递的数据:inject("数据名")
App:{{ obj }}
About:{{ msg }}
此时,不论在哪个组件修改数据,数据都会被修改成功,并渲染到页面上
toRaw
修饰数据:
App:{{ obj }}
此时,后代组件无法修改并渲染接收的数据,但是数据是已经被修改了的,页面重新渲染的话,还是会显示最新数据
readonly
修饰数据:
App:{{ obj }}
此时,后代组件不能修改接收的数据;但父级组件自己还是可以修改数据的。
let 变量 = computed( () => X )
faMsg:{{ faMsg }}
coMsg:{{ coMsg }}
变量 = computed( { get(){ return X }, set(val){ } } )
faMsg:{{ faMsg }}
coMsg:{{ coMsg }}
watch( 数据名, (oldVal, newVal) => {}[, 配置对象] )
name:{{ name }}
watch( [数据1, 数据2], (oldVal, newVal) => {}[, 配置对象] )
name:{{ name }}
gender:{{ gender }}
ref
定义的数据,默认不是深度监听,需要设置 deep: true
才会深度监听
faMsg.name:{{ faMsg.name }}
reactive
定义的数据,强制是深度监听deep: false
,还是会深度监听
faMsg.name:{{ faMsg.name }}
取消强制深度监听
watch( () => 数据, (oldVal, newVal) => {}[, 配置对象] )
deep: true
才会深度监听
faMsg.name:{{ faMsg.name }}
获取 oldVal 值
faMsg:{{ faMsg }}
_
并使用懒加载技术配合 _.cloneDeep(数据)
,以获取 oldVal 和 newVal 值
faMsg.name:{{ faMsg.name }}
obj.name:{{ obj.name }}
num:{{ num }}