六十六、vue组件

一 组件基础

1.1 定义全局组件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
</head>
<body>
<div id="app">
<button-counter></button-counter>
<button-counter></button-counter>
<button-counter></button-counter>
</div>
</body>
<script>
    Vue.component('button-counter',{
        template:`
        <button @click="count++">You clicked me {{ count }} times.</button>
        `,
        data(){
            return {
                count:0
            }
        }
    })
    let vm = new Vue({
        el: '#app',
        data: {},
    })
</script>
</html>

在这里插入图片描述

1.2 定义局部组件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
</head>
<body>
<div id="app">
<navbar></navbar>
</div>
</body>
<script>
Vue.component('navbar', {
    template: `
        <div>
            <button @click="handleClick">返回</button>
            我是NavBar
            <button style="background: red">主页</button>
            <br>
            <child></child>
        </div>
    `,
    methods: {
        handleClick() {
            console.log('nav nav')
        },
    },
    components: {
            child: {
                template: `<button>navbar的子标签</button>`,
            }

        }
})
    let vm = new Vue({
        el: '#app',
        data: {}
    })
</script>
</html>

二 组件通信

2.1 父子通信之子传父

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>

</head>
<body>
<div id="app">
    <h1>自定义事件实现父子通信之子传父</h1>
    父组件中的name值为:{{name}}
    <hr>
    <init @myevnet="handleEvent"></init>
    <hr>

</div>
</body>
<script>


    var init = {
        template: `
          <div>
          <h1>我是init组件</h1>
          <input type="text" v-model="name"> ---》{{ name }}
          <br>
          <button @click="handleSend">点我把name传给父组件</button>
          </div>`,
        data() {
            return {
                name: ''
            }
        },
        methods: {
            handleSend() {
                // alert('我被点了')
                // 在这里,触发自定义事件的执行
                this.$emit('myevnet', this.name)
            }
        }

    }
    var vm = new Vue({
        el: '#app',
        data: {
            name: '刘亦菲'
        },
        methods: {
            handleEvent(name) {
                this.name = name
            }
        },
        components: {
            init
        }


    })


</script>
</html>

2.2 父子通信之父传子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
</head>
<body>
<div id="app">
    <!--保证属性名和props中的属性名和变量名一致即可-->
    <!--注意数据绑定-->
    <!--可以传多个,但是注意,传入的isshow是字符串,可以使用数据绑定变成布尔-->
    <navbar :myname="name" :isshow="true"></navbar>
</div>
</body>
<script>
    //没有代码提示,语法检查,目前这么用
    //后面会使用webpack打包,直接定义成 xx.vue文件,通过webpack打包
    Vue.component('navbar', {
        template: `
            <div>
                <button>返回</button>
                父组件传递的内容是:{{myname}}
                传入的布尔是{{isshow}}
                <button>主页</button>
                <br>
            </div>
        `,
        // props:['myname'],
        props:{
            myname:String,
            isshow:Boolean,
        },
    })
    var vm = new Vue({
        el: '#app',
        data: {
            name:'jasper'
        },

    })
</script>
</html>

2.3 ref属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
</head>
<body>
<div id="app">
<!--    通过ref,获取input的值-->
    <input type="text" ref="mytext">
    <button @click="handleClick">点我</button>
    <child ref="mychild"></child>
</div>
</body>
<script>
    Vue.component('child',{
        template:`<div>child</div>`,
        data(){
            return {
                text:'子组件数据'
            }
        },
        methods:{
            add(){
               console.log('子组件的add方法')
            }
        }
    })
 var vm = new Vue({
        el: '#app',
        data: {

        },
        methods: {
            handleClick() {
                console.log(this)
                //this.$refs.mytext 获取到input控件,取出value值
                console.log(this.$refs.mytext.value)
                console.log(this.$refs.mychild.text)
                // this.$refs.mychild.add()
                this.$refs.mychild.add('传递参数')

            }
        }

    })
</script>
</html>

三 动态组件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
</head>
<body>
<div id="box">
    <ul>
        <li><a @click="who='child1'">首页</a></li>
        <li><a @click="who='child2'">商品</a></li>
        <li><a @click="who='child3'">购物车</a></li>
    </ul>
    <keep-alive>
         <component :is="who"></component>
    </keep-alive>

</div>
</body>
<script>
    Vue.component('child1', {
        template: `<div>
          首页
        </div>`,

    })
    Vue.component('child2', {
        template: `<div>
                   商品
                   <input type="text">
                    </div>`,
    })
    Vue.component('child3', {
        template: `<div>
                   购物车
                    </div>`,
    })
    var vm = new Vue({
        el: '#box',
        data: {
            who:'child1'
        },

    })
</script>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值