玩转Vue_组件

什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可;

组件化和模块化的不同:

  • 模块化: 是从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职能单一;
  • 组件化: 是从UI界面的角度进行划分的;前端的组件化,方便UI组件的重用;

全局组件定义的三种方式

这里讲一种

全局组件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    
    <title>组件</title>
</head>
<body>
    
    <div id="app">
        <login></login>
    </div>

    <script src="./js/vue.js"></script>
    <script>
        Vue.component('login',{
            template : `<h1>{{msg}}</h1>`,
            data() {
                return {
                    msg: '登录'
                }
            },
        })

        const vm = new Vue({
            el : '#app',
            data : {

            }
        })
    </script>
</body>
</html>
局部组件
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <account></account>
    </div>

    <script src="./js/vue.js"></script>
    <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
            el: '#app',
            data: {},
            methods: {},
            components: { // 定义子组件
                account: { // account 组件
                    template: '<div><h1>这是Account组件{{name}}</h1><login></login></div>', // 在这里使用定义的子组件
                    data() {
                        return {
                            name: '张三'
                        }
                    },
                    components: { // 定义子组件的子组件
                        login: { // login 组件
                            template: "<h3>这是登录组件</h3>"
                        }
                    }
                }
            }
        });
    </script>
</body>

</html>
组件切换
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <input type="button" value="toggle" @click="flag=!flag">
        <my-com1 v-if="flag"></my-com1>
        <my-com2 v-else></my-com2>
    </div>

    <script src="./js/vue.js"></script>
    <script>
        Vue.component('myCom1', {
            template: '<h3>奔波霸</h3>'
        })

        Vue.component('myCom2', {
            template: '<h3>霸波奔</h3>'
        })

        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
            el: '#app',
            data: {
                flag: true
            },
            methods: {}
        });
    </script>
</body>

</html>
父组件向子组件传值
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <son :finfo="msg"></son>
    </div>

    <script src="./js/vue.js"></script>
    <script>
        const vm = new Vue({
            el: '#app',
            data: {
                msg: '这是父组件的值'
            },
            components: {
                son: {
                    template: '<h1>这是子组件 --- {{finfo}}</h1>',
                    props: ['finfo']
                }
            }
        })
    </script>
</body>

</html>
子组件向父组件传值
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <son @func="getMsg"></son>
    </div>  
    <script src="./js/vue.js"></script>
    <script>
        Vue.component('son',{
            template : `<button @click="sendMsg">子组件按钮</button>`,
            data() {
                return {
                    sonmsg: '子组件传过来的值'
                }
            },
            methods: {
                sendMsg(){
                    this.$emit('func',this.sonmsg)
                }
            },
        })

        const vm = new Vue({
            el : '#app',
            data : {},
            methods : {
                getMsg(val){
                    alert(val);
                }
            }
        })
    </script>
</body>

</html>
ref获取元素
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>目标:主要练习父子组件之间传值</title>
</head>

<body>
    <div id="app">
        <div>
            <input type="button" value="获取元素内容" @click="getElement" />
            <!-- 使用 ref 获取元素 -->
            <h1 ref="myh1">这是一个<span>大</span>大的H1</h1>
            <hr>
            <!-- 使用 ref 获取子组件 -->
            <my-com ref="mycom"></my-com>
        </div>
    </div>
    <script src="./js/vue.js"></script>
    <script>
        Vue.component('my-com',{
            template: '<h5>这是一个子组件</h5>',
            data() {
                return {
                    name: '子组件'
                }
            }
        });

        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
            el: '#app',
            data: {},
            methods: {
                getElement() {
                    // 通过 this.$refs 来获取元素
                    console.log(this.$refs.myh1.innerText);
                    // 通过 this.$refs 来获取组件
                    console.log(this.$refs.mycom.name);
                }
            }
        });
    </script>
</body>

</html>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文章是我最近在公司的一场内部分享的内容。我有个习惯就是每次分享都会先将要分享的内容写成文章。所以这个文集也是用来...
    Awey阅读 13,125评论 4 67
  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 12,691评论 1 33
  • Vue创建组件 什么是组件 什么是组件?组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划...
    TyCoding阅读 3,677评论 0 2
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,805评论 1 32
  • 尚俊平,焦点网络中级,坚持分享965天,2018年12月17日,星期1 著名的马歇尔卢森堡博士,发现了神奇而平和的...
    32598db751bb阅读 1,657评论 0 1