setup() 钩子
: setup()
自身并不含对组件实例的访问权,即在 setup()
中访问 this 会是 undefined; 在模板中访问从 setup()
返回的 ref 时,它会自动浅层解包,因此你无须再在模板中为它写 .value
。当通过 this 访问时也会同样如此解包;setup(props)
函数的第一个参数是组件的 props
export default {
setup(props, context) {
const {title} = toRefs(props)
console.log(title.value)
const title1 = toRef(props, 'title1')
console.log(context.attrs)
console.log(context.slots)
console.log(context.emit)
console.log(context.expose)
}
}
setup
也可以返回一个渲染函数, 返回一个渲染函数将会阻止我们返回其他东西, 我们可以通过调用 expose()
解决这个问题
export default {
setup(props, {expose}) {
const count = ref(0)
const increment = () => ++count.value
expose({
increment
})
return () => h('div', count.value)
}
}
reactive()
, 返回一个对象的响应式代理, 响应式转换是“深层”的:它会影响到所有嵌套的属性,若要避免深层响应式转换,只想保留对这个对象顶层次访问的响应性,请使用 shallowReactive() 作替代reactive()
, 它只能用于对象类型 (对象、数组和如 Map、Set 这样的集合类型)。它不能持有如 string、number 或 boolean 这样的原始类型reactive()
, 不能替换整个对象
let state = reactive({count: 0})
state = reactive({count: 1})
reactive()
, 对解构操作不友好:当我们将响应式对象的原始类型属性解构为本地变量时,或者将该属性传递给函数时,我们将丢失响应性连接
const books = reactive([ref('Vue 3 Guide')])
console.log(books[0].value)
const count = ref(1)
const obj = reactive({})
obj.count = count
watchEffect(callback(onCleanup))
立即运行一个函数,同时响应式地追踪其依赖,并在依赖更改时重新执行; 第一个参数就是要运行的副作用函数。这个副作用函数的参数(onCleanup) 也是一个函数,用来注册清理回调
watchEffect(async (onCleanup) => {
onCleanup(() => {
})
})
watch()
, 侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数。第一个参数是侦听器的源。这个来源可以是以下几种:一个函数,返回一个值; 一个 ref; 一个响应式对象;
const state = reactive({count: 0})
watch(
() => state.count,
(count, prevCount) => {
}
)
const count = ref(0)
watch(count, (count, prevCount) => {
})
const state = reactive({foo: 1})
const fooRef = toRef(state, 'foo')
const fooRef = ref(state.foo)
toRef(props, 'foo')
toRef(() => props.foo)
toValue()
将值、refs 或 getters 规范化为值, 与 unref()
类似
toRefs()
, 将一个响应式对象转换为一个普通对象,这个普通对象的每个属性都是指向源对象相应属性的 ref
。每个单独的 ref
都是使用 toRef()
创建的, 针对 reactive()
解构操作不友好的 API
function useFeatureX() {
const state = reactive({
foo: 1,
bar: 2
})
return toRefs(state)
}
const {foo, bar} = useFeatureX()
shallowRef()
, 只有对 .value
的访问是响应式的
const state = shallowRef({count: 1})
state.value.count = 2
state.value = {count: 2}
triggerRef()
, 强制触发依赖于一个浅层 ref 的副作用