路飞-父传子数据

父传子数据

父子组件无法直接通讯,比如父组件data里面有 msg变量,子组件并不能直接引用。

解决方案:

1)父组件模板中写子组件标签
2)父组件的数据绑定给子组件标签的自定义属性
3)在子组件内部通过props拿到自定义属性
4)使用自定义属性就可以获得父组件的数据

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>父传子</title>
</head>
<body>
    <div id="app">
        <!--总结:
        1)父组件模板中写子组件标签
        2)父组件的数据绑定给子组件标签的自定义属性
        3)在子组件内部通过props拿到自定义属性
        4)使用自定义属性就可以获得父组件的数据
        -->
        <sub-tag :a="msg"></sub-tag> 
        <!--注意:不要在sub-tag标签里面绑定事件,绑定事件无效且会报错。 -->
    </div>
</body>
<script src="js/vue.js"></script>
<script>
    let subTag = {
        // 子组件通过props实例成员获取自身自定义属性
        props: ['a'],
        template: `
        <div>
            <h1>{{ a }}</h1>
        </div>
        `
    };

    new Vue({
        el: '#app',
        data: {
            msg: '父级数据'
        },
        components: {
            subTag,
        }
    })
</script>
</html>

for循环父传子

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>父传子案例</title>
    <style>
        .box {
            width: 200px;
            text-align: center;
            border: 1px solid black;
            border-radius: 10px;
            overflow: hidden;
            float: left;
        }
        .box img {
            width: 100%;
        }
        .box p {
            margin: 0;
        }
        .box span:hover {
            cursor: pointer;
            color: orange;
        }
    </style>
</head>
<body>
    <div id="app">
        <box-tag v-for="box_obj in box_data" :box_obj="box_obj"></box-tag>
    </div>
</body>
<script src="js/vue.js"></script>
<script>

    let boxTag = {
        props: ['box_obj'],
        template: `
        <div class="box">
            <img :src="box_obj.img_url" alt="">
            <p>
                <span @click="btnClick">点击了{{ num }}下</span>
                <p>{{ box_obj.img_title }}</p>
            </p>
        </div>
        `,
        data () {
            return {
                num: 0
            }
        },
        methods: {
            btnClick () {
                this.num += 1;
            }
        }
    };


    // 后台的数据
    let back_data = [
            {
                img_url: 'img/001.jpg',
                img_title: '野兽1'
            },
            {
                img_url: 'img/002.jpg',
                img_title: '野兽2'
            },
            {
                img_url: 'img/003.jpg',
                img_title: '野兽3'
            }
        ];

    new Vue({
        el: '#app',
        data: {
            box_data: back_data
        },
        components: {
            boxTag,
        }
    })
</script>
</html>
posted @ 2019-09-04 16:00  张明岩  阅读(254)  评论(0编辑  收藏  举报