vue组件间通信

父组件页面

<template>
    <div>
        <p>我是父组件</p>

        图书名:<input type="text" v-model="name">
        价格:<input type="text" v-model="price">
        所属分类:
        <select v-model="classify">
                <option :value="i.id" v-for="i in classifylist" :key="i.id">{{i.cname}}</option>
        </select>
            <button @click="addbook" v-show="flag==1">添加</button>
            <button @click="aUpdate" v-show="flag==2">修改</button>
        <hr>
		
		<!-- 展示子组件的内容 -->
        <!-- :后的时子组件里面接收的名字,=后面的是父组件的名字 -->
        <!-- @后面的是子组件里定义的名字,=是父组件里获取参数的名字 -->
        <booklist @upbook="Update"></booklist>
    </div>
</template>
import {put_book,add_book,get_book} from '../api/api'

<script>

//导入axios函数  
import {put_book,add_book,get_book} from '../api/api'
export default {

 components:{
        booklist
    },
    data() {
        return {
            name:"",
            price:"",
            classifylist:[],
            classify:1,
            flag:1,
            id:1
        }
    },
	methods: {
	        aUpdate(){
	         	//直接使用导入的axios函数
	            this.flag=2
	            var data={'name':this.name,'price':this.price,'classify':this.classify,'id':this.id}
	            put_book(data).then(resp=>{
	                 alert('修改成功!')
	                this.$router.go(0)
	            })
	        },
	        Update(val){
	            this.flag=2
	            console.log(val)
	            this.id=val[0].id
	            this.name=val[0].name
	            this.price=val[0].price
	            this.classify=val[0].classify
	        },
	        addbook(){
	            var data={'name':this.name,'price':this.price,'classify':this.classify}
	             //直接使用导入的axios函数
	            add_book(data).then(resp=>{
	                console.log(resp.data)
	                alert("添加成功")
	            })
	        },  
	        getbook(){
	         //直接使用导入的axios函数
	            get_book().then(resp=>{
	                this.classifylist=resp
	                //注意axios封装已经把数据封装好直接赋值resp就可以,不需要.data
	                console.log(resp)
	            })
	        }
	    }
	}
}
</script>

子组件页面

<template>
    <div>
        <p>我是子组件</p>

        <table>
            <tr>
                <td>图书名</td>
                <td>价格</td>
                <td>所属分类</td>
            </tr>
            <tr v-for="i in bookList" :key="i.id">
                <td>{{i.name}}</td>
                <td>{{i.price}}</td>
                <td>{{i.classify.cname}}</td>
                <td><button @click="UpdateBook(i.id,i.name,i.price,i.classify.id)">修改</button></td>
            </tr>
        </table>
    </div>
</template>

<script>
import axios from 'axios'
import {getBook1} from '../api/api'

export default {
    data() {
        return {
            bookList:[]
        }
    },
    methods: {
        UpdateBook(id,name,price,classify){
            let upbook=new Array()
            upbook.push({'id':id,'name':name,'price':price,'classify':classify})
            console.log(upbook)
            
            this.$emit('upbook',upbook)
        },
        getbook(){
            getBook1().then(resp=>{
                console.log(resp)
                this.bookList=resp
            })

            // axios({
            //     url:"http://127.0.0.1:8000/booklist/"
            // }).then(resp=>{
            //     console.log(resp.data)
            //     this.bookList=resp.data
            // })
        }
    },
    created() {
        this.getbook()
    }
}
</script>

<style scoped>
table,tr,td{
    margin: 0 auto;
    border: 1px dashed blue;
}
</style>

先看效果图
在这里插入图片描述

总结以下几点
父子组件的调用:

  • Import 导入子组件
  • compants注册子组件
  • 注册的子组件当做标签来使用

父组件给子组件传参:

  • 父组件里的子标签里写上要传递的数据 (:子组件的参数名字=父组件的参数名字)
  • 在子组件里注册参数(props)
  • 使用父组件传过来的参数

子组件给父组件传参:

  • 子组件里先用特定的方法来把数据传递给父组件( this.$emit(“方法的名字”,要传递的数据) )
  • 父组件的子标签里来接收数据(@子组件的方法 = 父组件的方法)
  • 在methods里接收传过来的val并赋值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值