(八)传递和访问 Props 属性

2023-02-22 18:07:31 浏览数 (1)

传递和访问 Props 属性

props 基本使用

props

optionsApi 和 compositionApi 传值的方式是一样的,不一样的是接收变化了一下

代码语言:javascript复制
// 在学习 compositionApi 使用 props 传值之前我们我们先来回顾一下 optionsAPi 使用 props 传值的方法

<h1>{{title}}</h1>
{
    props: ['title', 'msg']
}

// compostionsApi 接收方法
// 使用方法是一样的
<h1>{{title}}</h1>      
{
    props: ['title', 'msg']
    
    setup(props) {
        // 访问props值
        console.log(props.title)
    }
}

二、转换非响应性 props 为响应性

说明1

如果我们传递是数据是通过 ref 或者是 reactive 定义的数据的话,那么他是响应的,子组件收到过后,无论是否通过结构它都是响应性的

代码语言:javascript复制
// 子组件接收到的是响应性的
const data = ref({
    title: 'props'
})

说明2

如果我们传递是数据是普通的数据,没有定义响应式的那么通过 watch 是无法监听到它响应变化的

代码语言:javascript复制
<FatherComponent title="标题" />

const { title } = props
// cosnt title = props.title
watch(
    () => title,
    (newVal, oldVal) => {
        // 传递的不是响应性的数据,watch 无法监听到
        console.log('不会执行')
    }
)

cosnt newCompued = computed( () => {
    // computed 同样也不会生效,因为他们依赖的都是响应性数据
    console.log('同样也不会生效')
})

说明3

如果需要把它转换成响应的数据,那么就需要使用 vue 提供的 toRefs() 方法来把他变成响应性的数据

代码语言:javascript复制
<FatherComponent title="标题" />

cosnt { title } = props
// const title = props.title

// 转换成响应的数据
cosnt { title } = toRefs(props)

watch(
    () => title,
    (newVal, oldVal) => {
        // 监听的数据转换成响应性的数据了,监听可以生效
        console.log('不会执行')
    }
)

三、ref/reactive 创建的数据在 props 中的响应性

说明

如果父组件通过给子组件传递是数据是通过 ref/reactive 创建的数据,那么无论子组件是否结构它都是响应性的;需要注意的是,当props 传递到子组件的值,通过 template 处理结构,props 的值就不在是一个 ref 格式的值了,而是一个 proxy 所以在使用 watch 监听的时候,不能直接把他作为第一个参数传递进去,二十需要把他写成回调函数的形式 () => props.title。如如果需要把传递进来的某一个属性转换成 ref 形式的数据那么 toRefs(props, 'title') 就需要接收两个参数了, 第一个参数是响应性对象,第二个参数是需要装换成 ref 的属性名;同时需要注意的是,如果父组件通过 ref 定义传递的是普通类型的值, 如数字,字符串,那么子组件接收的时候,它就不是响应性的了,需要调用 toReds 来给他装换成响应性的

总结:写在最后

总结

如果我们传递的数据不是通过 ref / reactive 来创建的,那么现在它就不是响应的值了, 如果需要把它变成响应的值,就需要调用 toRefs() 来把它变成响应性的数据,props 作为参数给他传递进去;需要注意的是,传递的数据只有是数组 或者是 对象的时候传递到子组件的数据才是响应性的,并且通过 ref 定义的数据传递到子组件的时候传递的是 它的 value

0 人点赞