2019-07-03

作者: 果冻_4c9b | 来源:发表于2019-07-03 15:42 被阅读0次

什么是组件: 组件的出现,就是为了拆分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>Document</title>
</head>

<body>


    <div id="app">
        <!-- 调用全局组件 -->
        <login-com></login-com>
        <register-com></register-com>
    </div>
    <script src="./js/vue.js"></script>
    <script>
        //  全局组件有三种
        Vue.component('login-com', {

            template: `<h1>这是我们的login组件  </h1>`//html模板内容
        })

        Vue.component('register-com', {

            template: `<h1>这是我们的register组件  </h1>`//html模板内容
        })
        var 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">
        <!-- 调用全局组件 -->
        <!-- <my-button></my-button>
         <my-button></my-button>
          <my-button></my-button> -->
        <mybtn></mybtn>
        <mybtn></mybtn>
        <mybtn></mybtn>
        <mybtn></mybtn>
        <mybtn></mybtn>
    </div>

    <script src="./js/vue.js"></script>
    <script>
        //    一般格式为xx-xxx,使用时也是这样的
        // Vue.component('my-button', {

        //     template: `<button @click="num++">这是点击我第{{num}}次  </button>`,//html模板内容
        //     data :function(){//data是一个函数才能复用
        //         return{
        //             num:0
        //         }
        //     }
        // })

        var mybtn = {

            template: `<button @click="num++">这是点击我第{{num}}次  </button>`,//html模板内容
            data: function () {//data是一个函数才能复用
                return {
                    num: 0
                }
            }
        }

        var vm = new Vue({
            el: "#app",
            data: {},
            components: {//注册局部组件
                mybtn//等同于'mybtn':mybtn
            }
        })
    </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="onOff = !onOff">
        <!-- 调用全局组件 -->
        <login-com v-if="onOff"></login-com>
        <registe-com v-else></registe-com>
    </div>
    <script src="./js/vue.js"></script>
    <script>
        //    一般格式为xx-xxx,使用时也是这样的
        Vue.component('login-com', {
            template: `<h1>这是个组册组件 </h1>`,//html模板内容
        })
        Vue.component('registe-com', {
            template: `<h1>这是个登陆组件 </h1>`,//html模板内容
        })
        var vm = new Vue({
            el: "#app",
            data: {
                onOff: true
            },
        })
    </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">
        <login :title="msg"></login>
    </div>
    <script src="./js/vue.js"></script>
    <script>
        Vue.component('login', {

            template: "<h1>dsfsdfsdf---{{num}}--- {{title}}</h1>",
            data() {
                return {
                    num: 123
                }
            },
            props: ['title']//传值
        })
        var vm = new Vue({
            el: "#app",
            data: {
                msg: 'fdsfdsf'
            }
        })
    </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='show'></son>
    </div>
    <script src="./js/vue.js"></script>
    <script>
        Vue.component('son', {

            template: "<button @click='sendMsg(num)'>dsfsdfsdf---</button>",
            data() {
                return {
                    num: 123
                }
            },
            methods: {
                sendMsg() {
                    this.$emit('func', this.num)//第一个参数是需要触发当前组件身上的函数,第二个参数是要发送的数据
                }
            },
        })
        var vm = new Vue({
            el: "#app",
            data: {
                msg: 'fdsfdsf'
            },
            methods: {
                show(val) {
                    console.log(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>Document</title>
</head>
<body>
     <div id="app">
         <button @click="getMag">获取某元素的内容</button>
         <h1 ref="myh1">asda<p>啊大沙发沙发</p></h1>
     </div>
    <script src="./js/vue.js"></script>
    <script>
    var vm = new Vue({
       el:"#app",
       data:{
           msg:'fdsfdsf'
       },
       methods:{
          getMag(){
              console.log('innerHtml'+this.$refs.myh1.innerHTML);
              console.log('innerText'+this.$refs.myh1.innerText);
          }
       }
    })
    </script>
</body>
</html>

相关文章

网友评论

    本文标题:2019-07-03

    本文链接:https://www.haomeiwen.com/subject/dyzqhctx.html