前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VUE2快速入门(五)---组件进阶与插槽

VUE2快速入门(五)---组件进阶与插槽

作者头像
代码哈士奇
发布2021-01-26 15:57:04
4030
发布2021-01-26 15:57:04
举报
文章被收录于专栏:dmhsq_csdn_blogdmhsq_csdn_blog

组件进阶与插槽

组件进阶

命名注意: MyTest/my-test 小写-小写或者大写加大写

局部注册和全局注册

以这两个组件为例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

局部注册

在需要用的页面import引入 在components注册

代码语言:javascript
复制
<template>
  <div>
      <test-com></test-com>
  </div>
</template>
<script>
import TestCom from "../components/testCom";
export default {
  name: "Test1125",
  components: {TestCom},
};
</script>

全局注册

方式一
在这里插入图片描述
在这里插入图片描述

在main.js中

代码语言:javascript
复制
import buttonMy from './components/button-my'

Vue.component("button-my", buttonMy);
在这里插入图片描述
在这里插入图片描述
方式二

自己写个js文件

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
import ButtonMy from "./button-my";

ButtonMy.install = function(Vue) {
  Vue.component(ButtonMy.name, ButtonMy);
};

export default ButtonMy
方式二好处

可以批量注册组件 比如EleentUi的注册

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Props

静态传值

上篇我们已经讲过,这里再次演示 我们已经全局注册ButtonMy组件

代码语言:javascript
复制
ButtonMy组件
<div>
    <h2>{{ title }}</h2>
    <button @click="count++">点击增加count</button>
    <div>count = {{ count }}</div>
      <button @click="changeText">改变标题</button>
  </div>
代码语言:javascript
复制
使用
<button-my title="我是代码哈士奇" ></button-my>
在这里插入图片描述
在这里插入图片描述

动态传值

注意 :title 其中 :v-bind: 简写

代码语言:javascript
复制
<button-my :title="text" @changeTexts="text = '我是狗'"></button-my>
在这里插入图片描述
在这里插入图片描述

传值类型

数字,字符,布尔值,数组,对象 当带有v-bind:时 会被认为js表达式 如果不加就是单纯的字符串或者数字

数字
代码语言:javascript
复制
 <button-my title=1 ></button-my>
在这里插入图片描述
在这里插入图片描述
字符
代码语言:javascript
复制
<button-my title="我是狗" ></button-my>
在这里插入图片描述
在这里插入图片描述
布尔值

注意 :

代码语言:javascript
复制
<button-my :title=false></button-my>

改造组件

代码语言:javascript
复制
<h2 v-if="title">{{ title }}</h2>
在这里插入图片描述
在这里插入图片描述
数组

传值

代码语言:javascript
复制
<button-my :title="[1,2,3]"></button-my>

组件中

代码语言:javascript
复制
<h2>{{ title[0] }}</h2>
在这里插入图片描述
在这里插入图片描述
对象

传一个完整的对象

代码语言:javascript
复制
 <button-my :title="{ name: '代码哈士奇', id: 741741741 }"></button-my>

组件中

代码语言:javascript
复制
<h2>{{ title.name }}</h2>
<h2>{{ title.id }}</h2>
在这里插入图片描述
在这里插入图片描述

传一个的对象某个属性

代码语言:javascript
复制
 <button-my :title="post.name"></button-my>
 <script>
export default {
  name: "Tests",
  data() {
    return {
      text: "I,dog",
      post:{ name: '代码哈士奇', id: 741741741 }
    };
  }
};
</script>

组件中

代码语言:javascript
复制
<h2>{{ title}}</h2>
在这里插入图片描述
在这里插入图片描述

自定义事件

代码语言:javascript
复制
this.$emit('myEvent')

我们上一篇已经使用过

在这里插入图片描述
在这里插入图片描述

插槽

模板的内容肯定不一样 但是同样模板只定义一个 就需要插槽 插入代码,插入数据等

信息插槽

定义

代码语言:javascript
复制
<template>
  <div>
    <p>
      <slot name="title"></slot>
    </p>
  </div>
</template>

<script>
export default {
  name: "EasyModel"
};
</script>

使用

代码语言:javascript
复制
<easy-model>
          <template slot="title">
            我是狗
          </template>
        </easy-model>

效果

在这里插入图片描述
在这里插入图片描述

代码插槽

代码语言:javascript
复制
<div>
      <slot name="message"></slot>
</div>

使用

代码语言:javascript
复制
<easy-model>
          <template slot="title">
            我是狗
          </template>
          <template slot="message">
            <h1>哈喽,点击下面链接去百度玩耍</h1>
            <a href="http://www.baidu.com">www.baidu.com</a>
          </template>
</easy-model>
在这里插入图片描述
在这里插入图片描述

使用例子

model代码

代码语言:javascript
复制
<template>
  <div>
    <section
      id="total"
      class="total-noShow"
      v-if="!mdshowd"
      @click="closeModal"
    ></section>
    <section
      id="comeIn"
      class="comeIn-noShow"
      v-bind:class="{ modalshow: mdshowd }"
    >
      <span
        style="position: relative;left:240px"
        v-if="!mdshowd"
        @click="closeModal"
        >X</span
      >
      <p style="width: 500px;align-content: center">
        <slot name="title"></slot>
      </p>
      <div class="main-Show">
        <slot name="message"></slot>
      </div>
      <div class="opTn">
        <slot name="btnGroup"></slot>
      </div>
    </section>
  </div>
</template>

<script>
export default {
  name: "model",
  props: ["mdshowd"],
  methods: {
    closeModal() {
      this.$emit("close");
    }
  }
};
</script>

<style scoped>
.total-noShow {
  width: 100%;
  height: 100%;
  position: fixed;
  top: 0;
  left: 0;
  background-color: #8f949a;
  opacity: 0.4;
}
.comeIn-noShow {
  width: 500px;
  height: 500px;
  background-color: white;
  position: absolute;
  left: 750px;
  top: 250px;
}
.opTn {
  width: 500px;
  height: 40px;
  position: relative;
  top: 80px;
}
.main-Show {
  width: 400px;
  height: 330px;
  position: relative;
  left: 50px;
  top: 30px;
}
.modalshow {
  display: none;
}
</style>

父组件js代码

代码语言:javascript
复制
<script>
import Model from "../components/model";
export default {
  name: "Tests",
  components: { Model },
  data() {
    return {
      text: "I,dog",
      show: true,
      post: { name: "代码哈士奇", id: 741741741 },
      datas:[{ name: "代码哈士奇", id: 1 },{ name: "哈哈", id: 2 }],
      lookData: ""
    };
  },
  methods:{
    look(item){
      this.show = false;
      this.lookData = item;
    },
    closeLook(){
      this.show = true;
      this.lookData = "";
    }
  }
};
</script>

例一—简单弹窗

现在我们结合之前学习的东西 来一个实践 实现一个如下弹窗

在这里插入图片描述
在这里插入图片描述

实现代码

代码语言:javascript
复制
<template>
  <div>
    <div v-for="item in datas" :key="item.id">
      <div>{{item.name}}==={{item.id}}</div>
      <button @click="look(item)">查看</button>
    </div>
    <model :mdshowd="show" @close="show = true">
    </model>
  </div>
</template>

例二—数据弹窗

进阶

在这里插入图片描述
在这里插入图片描述

实现代码

代码语言:javascript
复制
<template>
  <div>
    <div v-for="item in datas" :key="item.id">
      <div>{{item.name}}==={{item.id}}</div>
      <button @click="look(item)">查看</button>
    </div>
    <model :mdshowd="show" @close="show = true">
      <template slot="title">{{lookData.name}}</template>
      <template slot="message">
        我叫{{lookData.name}},我的代号是{{lookData.id}}
      </template>
      <template slot="btnGroup">
        <button @click="closeLook">关闭</button>
      </template>
    </model>
  </div>
</template>

记得练习哦

  大家好,我是代码哈士奇,是一名软件学院网络工程的学生,因为我是“狗”,狗走千里吃肉。想把大学期间学的东西和大家分享,和大家一起进步。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行更新,博客主页:https://blog.csdn.net/qq_42027681

未经本人允许,禁止转载

在这里插入图片描述
在这里插入图片描述

后续会推出

前端:vue入门 vue开发小程序 等 后端: java入门 springboot入门等 服务器:mysql入门 服务器简单指令 云服务器运行项目 python:推荐不温卜火 一定要看哦 一些插件的使用等

大学之道亦在自身,努力学习,热血青春

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-11-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 组件进阶与插槽
  • 组件进阶
    • 局部注册和全局注册
      • 局部注册
      • 全局注册
    • Props
      • 静态传值
      • 动态传值
      • 传值类型
      • 自定义事件
    • 插槽
      • 信息插槽
      • 代码插槽
    • 使用例子
      • 例一—简单弹窗
      • 例二—数据弹窗
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档