Vue——18——组件

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

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

一:创建组件:

1.方法一:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../lib/vue.js"></script>
    <link rel="stylesheet" href="../lib/animate.css">
    <style>


    </style>
</head>

<body>
    <div id="app">
        <!-- 如果要使用组件,直接把组件的名称以HTML标签的形式,
        引入到页面中即可 
        名字不能写驼峰,如果命名的时候是驼峰就在这改成-
          -->
        <my-com1></my-com1>
    </div>


    </div>
    <script>
        /*方法一:
        //1.1使用Vue.extend来创建全局的Vue组件
        var com1 = Vue.extend({
            template: '<h3>这是使用Vue.extend创建的组件</h3>' //通过template属性制定了组件要展示的HTML结构
        })
        //1.2使用Vue.component('组件的名称',创建出来的组件模板对象)
        // 如果使用Vue.component定义全局组件的时候,
        组件名称使用了驼峰命名,则在引用组件的时候,需要把驼峰改成小写的字母,
        // 同时两个单词之间使用-连接,如果不使用驼峰,名字直接拿来用就行
        Vue.component('myCom1', com1)
        */
        /* 方法一的简写:
        Vue.component('myCom1', Vue.extend({
            template: '<h3>这是使用Vue.extend创建的组件</h3>'
        }))*/

        // 再简写
// 注意:不论是哪种方式创建出来的组件,组件的template属性指向的模板内容,必须有且只能有
// 唯一一个根元素,比如h3和span就会报错,同级元素,但是可以用一个div包起来
        Vue.component('myCom1', {
            template: '<div><h3>这是使用Vue.extend创建的组件</h3><span>这是span</span></div>'
        })

        var vm = new Vue({
            el: "#app",
            data: {},
            methods: {}
        })
    </script>
</body>

</html>

2.方法二

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../lib/vue.js"></script>

</head>

<body>
    <div id="app">
        <!-- 标签形式 -->
        <mycom></mycom>
    </div>
    <div id="app2">
        <mycom></mycom>
    </div>
    <!-- 在被控制的#app外面,使用template元素,定义组件的HTML模板结构 -->
    <template id="tmp">
        <div>
            <!-- 同级元素同样不能在一起,用更大的div包一起 -->
            <h1>这是通过template元素,在外部定义的组件结构,这个方式有代码的智能提示和高亮</h1>
            <h4>h4标签</h4>
        </div>
    </template>
    <script>
        Vue.component('mycom', {
            template: '#tmp'
        })
        var vm = new Vue({
            el: "#app",
            data: {},
            methods: {}
        })
        var vm2 = new Vue({
            el: "#app2",
            data: {}, 
            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">
    <title>Document</title>
    <script src="../lib/vue.js"></script>
     
</head>

<body>
    <div id="app"> 
       <mylogin></mylogin>
     
     
    </div>
  
    <script>
        //对象变量,并不是名字,定义的一个组件模板对象
      var login={
          template:'<h1>123456<h1>'
      }
      Vue.component('mylogin',login)
        var vm = new Vue({
            el: "#app",
            data: {
               
            },
            methods: {}
        })
    </script>
</body>

</html>

3.私有组件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../lib/vue.js"></script>

</head>

<body>
    <div id="app">

    </div>
    <div id="app2">
        <login></login>
    </div>

    <template id="tmp">
        <h1>这是一个私有组件</h1>
    </template>

    <script>
        var vm = new Vue({
            el: "#app",
            data: {},
            methods: {}
        })
        var vm2 = new Vue({
            el: "#app2",
            data: {},
            methods: {},
            components: {
                //定义实例内部私有组件  只能在vm2控制的区域用
                login: {
                    template: '#tmp'
                }
            }
        })
    </script>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../lib/vue.js"></script>

</head>

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

    </div>

    <script>
        //对象变量,并不是名字,定义的一个组件模板对象
        var login = {
            template: '<h1>123456<h1>'
        }

        var vm = new Vue({
            el: "#app",
            data: {

            },
            methods: {},
            components: {
                login
            }
        })
    </script>
</body>

</html>

二:组件中的data

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../lib/vue.js"></script>

</head>

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

    <script>
        // 组件可以有自己的data数据,组件的data和实例的data不一样,实例的data可以为一个对象,但是组件中的必须是一个方法
        //组件中的data除了必须为一个方法之外,这个方法内部还必须返回一个对象
        //组件中的data数据使用方式和实例中的data使用方式完全一样
        Vue.component('mycom',{
            template:'<h1>这是全局组件----{{msg}}</h1>',
            data:function(){
              return {
                  msg:'这是组件中的data定义的数据'
              }
            }
        })
        var vm = new Vue({
            el: "#app",
            data: {},
            methods: {}
        })
       
    </script>
</body>

</html>

1.为什么组件的data必须是一个function

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../lib/vue.js"></script>

</head>

<body>
    <div id="app">
        <counter></counter>
        <hr>
        <counter></counter>
        <hr>
        <counter></counter>
    </div>
    <template id="tmp">
        <div>
            <input type="button" value="+1" @click="increment">
            <h3>{{count}}</h3>
          
    </template>
    <script>
        //设置一个计数器组件,每当点击按钮  让data中的count值+1
        // var dataObj = {
        //     count: 0
        // }
        Vue.component('counter', {
            template: '#tmp',

            data: function () {
                //在上面定义了dataObj 这种方式点击一个+1的按钮 其他的都跟着加,
                //如果是每次经历一个data里面的function  这样就会重新有个数据,说明data必须是个function
                // return dataObj
                return { count: 0}
            },
            methods:{
                increment(){
                    this.count++
                }
            }
        })
        var vm = new Vue({
            el: "#app",
            data: {},
            methods: {}
        })
    </script>
</body>

</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值