Vue——05-01组件的基本使用、全局组件,局部组件、父子组件的区别、注册组件的语法糖以及分离写法

简介: 组件的基本使用、全局组件,局部组件、父子组件的区别、注册组件的语法糖以及分离写法

首先了解一下注册的两种方式:

全局注册,通过Vue.component

局部注册,通过 components:{cpnc:cpnc}

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title></title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
            <!-- 自定义组件 -->
    <!-- <my-cpn></my-cpn> -->
    <cpnc></cpnc>
  </div>
  <script type="text/javascript">
  const cpnc = Vue.extend({
    template:
    `<div>
    <h2>标题</h2>
    <p>这是一个p标签</p>
    </div>`
  })
  // Vue.component('my-cpn',cpnc)  //全局组件化
    const vm = new Vue({
    el:'#app',
    data:{
    },
    methods:{
    },
    components:{  //局部组件化
      // cpnc:cpnc
      cpnc   //ES6语法简化写法
    }
    })
  </script>
  </body>
</html>

效果图如下:

8402473d019e467a9c5f806991aa81e5.png

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title></title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
            //1、3、使用间隔符
    <my-cpn></my-cpn>
  //2、  <!-- <cpnc></cpnc> -->
  </div>
  <script type="text/javascript">
  // 
  const cpnc = Vue.extend({
    template:
    `<div>
    <h2>标题</h2>
    <p>这是一个p标签</p>
    </div>`
  })
  // Vue.component('my-cpn',cpnc)  //1、全局组件化
    const vm = new Vue({
    el:'#app',
    data:{
    },
    methods:{
    },
    components:{  //2、局部组件化
      // cpnc:cpnc
      // cpnc   //ES6语法简化写法
                ///3、这里使用驼峰命名
      myCpn:cpnc
    }
    })
  </script>
  </body>
</html>

1.在全局注册组件时,推荐组件名使用间隔符Vue.component('my-cpn', cpnc) ,也可用驼峰写法 Vue.component('myCpn',cpn);同时 父组件中只能使用 ,不能使用。

2.在局部注册组件时,推荐使用components: {cpnc: cpnc}或者components: {cpnc} 还有components: {myCpnc:cpnc}都可

父组件与子组件的区别

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title>子组件与父组件的区别</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
    <cpn2>
    <!-- <cpn1></cpn1> -->
    </cpn2>
  </div>
  <script type="text/javascript">
    const cpn1 = Vue.extend({
    template: `
    <div>
                <h2>标题一</h2>
                <p>内容1...</p>
                <p>内容1...</p>
            </div>
    `
    })
    const cpn2 = Vue.extend({
    template: `
    <div>
       <h2>标题二</h2>
       <p>内容2...</p>
       <p>内容2...</p>
    <cpn1></cpn1> 
    </div>`,
    components: {
      cpn1
    }
    })
    const vm = new Vue({
    el: '#app',
    data: {
    },
    methods: {
    },
    components: {
      cpn2
    }
    })
  </script>
  </body>
</html>

就是父组件中包含一个子组件形成一个父子关系

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title>子组件与父组件的区别</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
    <cpn2>
    <!-- <cpn1></cpn1> -->
    </cpn2>
  </div>
  <script type="text/javascript">
    const cpn1 = Vue.extend({
    template: `
    <div>
                <h2>标题一</h2>
                <p>内容1...</p>
                <p>内容1...</p>
            </div>
    `
    })
    const cpn2 = Vue.extend({
    template: `
    <div>
       <h2>标题二</h2>
       <p>内容2...</p>
       <p>内容2...</p>
    <cpn1></cpn1> 
    </div>`,
    components: {
      cpn1
    }
    })
    const vm = new Vue({
    el: '#app',
    data: {
    },
    methods: {
    },
    components: {
      cpn2
    }
    })
  </script>
  </body>
</html>

效果:


这种用构造器的方法写太过于繁琐,这里有另一种写法:

注册组件的语法糖

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
    <title>全局组件语法糖</title>
</head>
<body>
    <div id="app">
        <!-- <cpn1></cpn1> -->
        <cpn2></cpn2>
    </div>
    <script>
        // 注册了全局组件,可以不用构造器
        Vue.component('cpn1',{
            template:`<div>
                        <h2>全局组件语法糖</h2>
                        <p>全局组件语法糖</p>
                    </div>`
        })
        const app = new Vue({
            el: "#app",
            data: {
            },
            components:{
                cpn2:{
                    template:`<div>
                        <h2>全局组件语法糖</h2>
                        <p>全局组件语法糖</p>
      <cpn1></cpn1>
                    </div>`
                }
            }
        })
    </script>
</body>
</html>

效果如下:

e4ec75fafd62422fb93dec5f029a02c2.png

由于把html语言写在组件里面很不方便,也不太好看所以将它们分开写。

下面就用到了另外两种

组件分离写法

第一种分离写法:<script type="text/x-template" id="">  

单独写一个script标签把组件写进去

例:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
    <div id="app">
      <cpn1></cpn1>
    </div>
    <script type="text/x-template" id="cpn1">    //模板分离语法
      <div>
        <h1>h1</h1>
        <p>p1</p>
      </div>
    </script>
    <script type="text/javascript">
      Vue.component('cpn1', {        //这里不要加#号
        template: '#cpn1'            //这里要加#号
      })
      const vm = new Vue({
        el: '#app',
      })
    </script>
  </body>
</html>
<script type="text/x-template" id="cpn1">

后面记得加id

输出结果:

7826655ff80645ea8309561a44ff39dc.png

第二种分离写法:<template>

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
    <div id="app">
      <cpn1>组件分离的第二种写法</cpn1>
    </div>
    <template id="cpn1">    //template标签
      <div>
        <h1>h1</h1>
        <p>p1</p>
      </div>
    </template>
    <script type="text/javascript">
      Vue.component('cpn1', {    //不加#号
        template: '#cpn1'        //加#号
      })
      const vm = new Vue({
        el: '#app',
      })
    </script>
  </body>
</html>

注意#号在什么位置添加,什么位置不添加

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
4天前
|
数据可视化 JavaScript
Vue3项目使用G6可视化组件实现一个树形机构图
在Vue 3项目中使用G6可视化组件库实现树形机构图的构建和展示。
38 1
Vue3项目使用G6可视化组件实现一个树形机构图
|
4天前
|
JavaScript
在Vue中使用Swiper轮播图、同时解决点击轮播图左右切换按钮不生效的问题、同时将轮播图抽离出为一个公共组件
这篇文章介绍了在Vue中如何使用Swiper插件创建轮播图,解决Swiper左右切换按钮不生效的问题,并展示了如何将Swiper轮播图抽离成一个可复用的公共组件,同时提供了详细的安装、配置和优化建议。
在Vue中使用Swiper轮播图、同时解决点击轮播图左右切换按钮不生效的问题、同时将轮播图抽离出为一个公共组件
|
4天前
|
JavaScript 前端开发
在Vue3+ElementPlus项目中实现一个简单的新增/移除行记录的小组件
在Vue 3和Element Plus项目中创建一个支持新增和移除行记录的简单表格组件。
29 0
|
4天前
|
JavaScript
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
这篇文章介绍了在Vue项目中如何实现执行删除等危险操作时的二次确认机制,使用Element UI的`el-popconfirm`组件来弹出确认框,确保用户在二次确认后才会执行删除操作。
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
|
4天前
|
JavaScript
如何创建一个Vue项目(手把手教你)
这篇文章是一篇手把手教读者如何创建Vue项目的教程,包括使用管理员身份打开命令行窗口、找到存放项目的位置、通过vue-cli初始化项目、填写项目信息、进入项目目录、启动项目等步骤,并提供了一些常见第三方库的引入方法。
如何创建一个Vue项目(手把手教你)
|
4天前
|
前端开发
StringBoot+Vue实现游客或用户未登录系统前、可以浏览商品等信息、但是不能购买商品或者加入购物车等操作。登录系统显示用户的登录名(源码+讲解)
这篇文章介绍了使用StringBoot+Vue实现用户登录状态判断的方法,包括前端加载用户信息和后端设置session的源码示例。
|
1天前
|
JavaScript
Vue学习之--------路由的query、params参数、路由命名(3)(2022/9/5)
这篇文章详细介绍了Vue路由中的query参数、命名路由、params参数以及props配置的使用方式,并通过实际项目案例展示了它们在开发中的应用和测试结果,同时解释了`<router-link>`的`replace`属性如何影响浏览器历史记录。
Vue学习之--------路由的query、params参数、路由命名(3)(2022/9/5)
|
1天前
|
JavaScript
Vue学习之--------VueX(2022/8/31)
这篇文章是关于VueX的基础知识介绍,涵盖了VueX中的state、mutations、getters和actions的定义和使用,以及Action提交mutation而非直接变更状态,以及mutations的同步执行特性。
Vue学习之--------VueX(2022/8/31)
|
1天前
|
JavaScript
Vue学习之--------深入理解Vuex之多组件共享数据(2022/9/4)
这篇文章通过一个实际的Vue项目案例,演示了如何在Vuex中实现多组件间共享数据。文章内容包括在Vuex的state中新增用户数组,创建Person.vue组件用于展示和添加用户信息,以及在Count组件中使用Person组件操作的数据。通过测试效果展示了组件间数据共享和状态更新的流程。
Vue学习之--------深入理解Vuex之多组件共享数据(2022/9/4)
|
1天前
|
JavaScript
Vue学习之--------深入理解Vuex之模块化编码(2022/9/4)
这篇文章详细介绍了Vuex的模块化编码和命名空间的使用,旨在让代码更易于维护并提高数据分类的明确性。内容包括模块化和命名空间的概念、如何在store中配置模块、以及如何在组件中使用模块化的数据。文章通过实战项目案例,展示了如何拆分`store/index.js`文件,创建`count.js`和`person.js`模块,并在`Count.vue`和`Person.vue`组件中使用这些模块。最后,文章还提供了测试效果和一些使用注意点。
Vue学习之--------深入理解Vuex之模块化编码(2022/9/4)