chaihongjun.me

Vue3中组件props和attrs有什么不同

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Vue3中组件props和attrs有什么不同</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/3.1.2/vue.global.js"></script>
</head>
<body>
    <div id="app">
        <p>{{ reverseMessage(message) }}</p>
        <son :title="message" :attr="message" @click="click" @mouseover="mouseover"></son>
    </div>
    <script>
    const app = Vue.createApp({
        setup(props, context) {
            console.log('context:');
            console.log(context);
            let { attrs, emit, slots } = context;
            let variable = 'abc';
            let message = Vue.ref(variable);
            console.log('typeof message:'+ typeof message)
            function reverseMessage(value) {
                return value + "_12345"
            }
            function click() {
                console.log('click')
            }
            function mouseover(){
                 console.log('mouseover')
            }
            return {
                message,
                reverseMessage,
                click,
                mouseover
            }
        },
    });
    const son = app.component('son', {
        template: `<h3>son组件</h3>`,
        props: ['title'],  //如果没有这个选项,setup里面没法访问props
        setup(props, context) {
            const { attrs, emit, slots } = context;
            console.log('props:')
            console.log(props)
            console.log('attrs:')
            console.log(attrs)
        }
    })
    app.mount("#app")
    </script>
</body>
</html>

代码运行之后的结果:

QQ截图20210630110625.png

从结果发现几个特征:

  1. props 必须在子组件内使用props选项,不然无法使用

  2. attrs和props都是Proxy类型

  3. props类型只适合数据传递,而方法则在attrs里面

  4. props加attrs包含全部的组件属性(除了id,style,class)

  5. props接收的属性,在渲染之后不会显示在DOM里

知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。作者:chaihongjun»