思路:

通过中间人父组件进行通信;

子组件先传给父组件,然后父组件再传给另一个子组件; 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../lib/vue.js"></script>
    <style>
        div img{
            width: 100px;
        }
        .active{
            width: 300px;
            min-height: 200px;
            background-color: yellow;
            position: fixed;
            right: 50px;
            top: 100px;
            border: 1px solid blue;
        }
    </style>
</head>
<body>
    <div id="box">
        <button @click="handleAjax">ajax</button>

        <film-item v-for="item in datalist" :key="item.filmId" :mydata="item" @event="handleEvent"></film-item>
        
        <film-detail :film-data="filmData"></film-detail>
    </div>
    <script>
        Vue.component("filmItem",{
            props:['mydata'],
            template:`
            <div>
                <img :src="mydata.poster">
                {{mydata.name}}
                <button @click="handleClick">详情</button>
            </div>
            `,
            methods:{
                handleClick(){
                    // console.log(this.mydata.synopsis)
                    this.$emit("event",this.mydata.synopsis)
                }
            }
        })

        Vue.component("filmDetail",{
            props:["filmData"],
            template:`
                <div class="active">
                    {{filmData}}
                </div>
            `
        })

        new Vue({
            el:"#box",
            data:{
                datalist:[],
                filmData:""
            },
            methods:{
                handleAjax(){
                    fetch("test.json").then(res=>res.json())
                    .then(res=>{
                        console.log(res.data.films)
                        this.datalist=res.data.films
                    })
                },
                //子传父自定义事件
                handleEvent(data){
                    console.log("父组件定义",data)
                    this.filmData=data
                }
            }
        })
    </script>
</body>
</html>

结果:

 

注意:

console.log(res.json())的结果是promise对象;

图示:

要通过res接收res.json()结果才是data数据;

 结果:

 

子组件传给父组件的data,是一个临时变量,如果父组件想用,就要定义一个状态来接收它:例如下图的:this.filmData = data 

 图示:

 

自定义属性,也不能写成驼峰写法,可以写成“-”的形式:

 

Logo

基于 Vue 的企业级 UI 组件库和中后台系统解决方案,为数万开发者服务。

更多推荐