定义Vue 组件

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

组件化和模块化的不同:

  • 模块化:是从代码逻辑的角度进行划分的;方便代码的分层开发,保证每个功能模块的职能单一;
  • 组件化: 是从UI界面的角度进行划分的;前端的组件化,方便UI组件的重用;
全局定义组件的三种方式
<!-- 引用方式 -->
<my-com></my-com>
  1. 使用 Vue.extend 配合 Vue.component 方法
// 定义
var com = Vue.extend({
    template: '<h3>创建了一个H3</h3>'  // 通过 template 属性 指定了组件要展示的属性
});
// 使用 Vue.component ('组件的名称', 创建出来的组件模板对象) 如果组件名是驼峰命名引用时需要加 -
Vue.component('myCom', com)

Vue.component('myCom', Vue.extend({ // 缩写
    template: '<h3>创建了一个H3</h3>'
}));
  1. 直接使用 Vue.component 方法
Vue.component('myCom', {
   template: '<div><h1>直接使用 component 创建的全局组件</h1><span>123</span></div>'
});
  1. 使用 Vue 提供的 template 标签 并结合 Vue.component 方法
<!-- 在Vue实例控制的区域之外定义 -->
<template id="temp">
    <h1>使用 template 标签, 之后再去 Vue实例中去引用 </h1>
</template>
Vue.component('myCom', {
    template: '#temp'
});

注意: 组件中的 DOM 结构, 有且只能有唯一的根元素(Root Element) 来进行包裹

定义私有组件
var vm = new Vue({
    el: '#app',
    components: {
        myCom: {
            template: '可以使用模板, 也可以只写表标签,规则与上述一致'
        }
    }
});
组件中的 data 和 methods
data
// 组件中可以有自己的 data 但是必须是一个方法, 还要 return 一个对象
Vue.component('myCom', {
    template: '<h1>调用方式和 Vue 实例一致: {{ msg }}</h1>',
    data: function () {
        return {
            msg: '组件中的data'
        }
    }
});
methods
Vue.component('myCom', {
   template: '<div><intpu type="button" value="+1" @click(increment)><h1>{{ msg }}</h1></div>',
   data: function () {
       return {msg : 0};
   },
   methods: {
    increment () {
        this.msg += 1;
    }
   }
});
切换组件的两种方式
使用 flag 标识符 结合v-if v-else 指令切换组件
<!-- 页面 -->
<div id="app">
    <a href="" @click="flag=true"></a>
    <a href="" @click="flag=false"></a>
    <login v-if="flag"></login>
    <register v-else="flag"><register>
</div>
// Vue 实例  此方法对于数量有一定缺陷
Vue.component('login', {
    template: '<h3>假设这是登录的组件</h3>'
});
Vue.component('register', {
    template: '<h3>假设这是注册的组件</h3>'
});
var vm = new Vue({
    el: '#app',
    data: { flag = true }
});
使用 component 标签, 来引用组件, 并通过 :is 属性指定要加载的组件
<!-- 页面 -->
<div id="app">
    <a href="" @click.prevent="comName='login'"></a>
    <a href="" @click.prevent="comName='register'"></a>
    <!-- component 是一个占位符, :is 属性,可以用来指定要展示组件的名称 -->
    <component :is="comName"></component>
</div>
Vue.component('login', {
   template: '<h3>假设这是登录的组件</h3>'
});
Vue.component('register', {
   template: '<h3>假设这是注册的组件</h3>'
});
var vm = new Vue({
    el: '#app',
    data: { comName: 'login' }
});
组件过渡动画
.v-enter, .v-leave-to {
    opacity: 0;
    transform: translateX(80px);
}
.v-enter-active, .v-leave-active {
    transition: all 0.4s ease;
}
<!-- 只是需要 transition 把 组件包裹起来就可以了 通过mode设置动画模式 -->
<transition mode="out-in">
    <component :is="comName"></component>
</transition>
父组件向子组件传递值
<div id="app">
    <!-- 1: 先通过 v-bind: 绑定自定义属性 然后指定值 -->
    <son v-bind:parentmsg="msg"></son>
</div>
var vm = new Vue({
    el: '#app',
    data: {
        msg: '这是父组件的内容'
    },
    components:
        son: {
            // 3: 通过 {{ parentmsg }} 的方式调用父组件中的值
            template: '这是子组件的内容 -- {{ parentmsg }}',
        },
        // 注意: props 是只读的, 虽然可以修改, 但是会报错
        props: ['parentmsg'], // 2: 再通过 props 定义父组件传过来的值
});
子组件向父组件传值
  1. 原理:父组件将方法的引用,传递到子组件内部,子组件在内部调用父组件传递过来的方法,同时把要发给父组件的数据,在调用方法的时候当做参数传递过去;
  2. 父组件将方法的引用传递给子组件,其中,getMsg 是组件中 methods 中定义的方法名,func 是子组件调用传递过来方法时候的方法名称 <son @func="getMsg"></son>
  3. 子组件内部通过 this.$emit('方法名', 要传递的数据) 方式, 来调用组件中的方法, 同时把数据传递给父组件使用
<div id="app">
    <son @func="getMsg"></son>
</div>
<template id="tmp">
    <input type="button" value="点击传递" @click="give">
</template>
var vm = new Vue({
  el: '#app',
  data: { fromChild: null },
  methods: {
    getMsg(param) {
      this.fromChild = param;
    }
  },
  components: {
    son: {
      template: '#tmpl',
      methods: {
        myclick() {
          this.$emit('func', this.child);
        }
      },
      data() {
        return {
          child: { name: 'son'}
        };
      },
    }
  }
});
使用 this.$refs 获取元素和组件
<div id="app">
    <input type="button" value="获取元素内容" @click="getElement" />
    <!-- 使用 ref 获取元素 -->
    <h1 ref="myh1"> 这是一个 h1 </h1>
    <hr />
    <!-- 使用 ref 获取子组件 -->
    <my-com ref="mycom"></my-com>
</div>
<script>
    Vue.component('my-com', {
        template: '<h5>这是一个子组件</h5>',
        data() {
            return { name: '子组件' }
        },
        methods: {
            show() {
                console.log('这是子组件的show方法');
            }
        }
    })
    var vm = new Vue({
        el: '#app',
        data: {},
        methods: {
            getElement() {
                // 通过 this.$refs 来获取元素
                console.log(this.$refs.myh1.innerText);
                // 通过 this.$refs 来获取组件 data 以及 methods
                console.log(this.$refs.mycom);
                console.log(this.$refs.mycom.name);
                console.log(this.$refs.mycom.show());
            }
        }
    });
</script>

Vue 基础 day03的更多相关文章

  1. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十八║Vue基础: 指令(下)+计算属性+watch

    回顾 今天来晚辣,给公司做了一个小项目,一个瀑布流+动态视频控制的DEMO,有需要的可以联系我,公司的项目就不对外展示了(一个后端程序员真的要干前端了哈哈哈). 书接上文,昨天正式的开始了Vue的代码 ...

  2. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十九║Vue基础: 样式动态绑定+生命周期

    回顾 哈喽大家好,前后端分离系列文章又开始了,今天周一,还是感谢大家花时间来观看我写的博客,周末呢,没有写文章,但是也没有闲着,主要是研究了下遗留问题,看过之前文章的应该知道,之前的在AOP使用Red ...

  3. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十║Vue基础终篇:传值+组件+项目说明

    缘起 新的一天又开始啦,大家也应该看到我的标题了,是滴,Vue基础基本就到这里了,咱们回头看看这一路,如果你都看了,并且都会写了,那么现在你就可以自己写一个Demo了,如果再了解一点路由,ajax请求 ...

  4. python 全栈开发,Day89(sorted面试题,Pycharm配置支持vue语法,Vue基础语法,小清单练习)

    一.sorted面试题 面试题: [11, 33, 4, 2, 11, 4, 9, 2] 去重并保持原来的顺序 答案1: list1 = [11, 33, 4, 2, 11, 4, 9, 2] ret ...

  5. Vue 基础精讲

    Vue 基础精讲 Vue 官方文档:https://cn.vuejs.org/v2/guide/ VUE 实例 每个组件都是一个 vue 的实例. 一个 vue 项目是由实例组成的. vue 实例上有 ...

  6. Vue基础以及指令

    Vue 基础篇一   一.Vue框架介绍 之前大家学过HTML,CSS,JS,JQuery,Bootstrap,现在我们要学一个新的框架Vue~ Vue是一个构建数据驱动的web界面的渐进式框架. 目 ...

  7. 2-5 vue基础语法

    一.vue基础语法 语法: {{msg}} html赋值: v-html="" 绑定属性: v-bind:id="" 使用表达式: {{ok? "ye ...

  8. Vue 1-- ES6 快速入门、vue的基本语法、vue应用示例,vue基础语法

    一.ES6快速入门 let和const let ES6新增了let命令,用于声明变量.其用法类似var,但是声明的变量只在let命令所在的代码块内有效. { let x = 10; var y = 2 ...

  9. vue基础知识之vue-resource/axios

    Vue基础知识之vue-resource和axios(三)   vue-resource Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的DOM选择器,就没 ...

随机推荐

  1. python request.args 解析

    requst.args 获得的是 列表类型原始 aa=ff&&bb=gg 通过request.args 分解为 ImmutableMultiDict([('page', u'10')] ...

  2. 【洛谷P2398】GCD SUM

    题目大意:求 \[\sum\limits_{i=1}^n\sum\limits_{j=1}^ngcd(i,j)\] 题解: 最重要的一步变换在于. \[\sum\limits_{k=1}^n k \s ...

  3. Android PdfViewer案例使用

    今天按项目要求找了一个android的PDF控件,各种操作效果都非常好,在这里和大家分享一下. com.joanzapata.pdfview:android-pdfview  该PDF控件加载大存储的 ...

  4. SpringBoot路径映射

    当然这个功能并非是springboot特有的,只是springboot提供了更简便的方法以供使用.     传统情况下我们跳转一个动态页面且并没有数据,也需要在controller中写一个跳转的con ...

  5. 解决Intellij IDEA中项目不能识别yml配置文件

    问题:能读取资源路径下的properties配置文件但是不能读yml配置文件 因为无法读取配置yml配置文件,所以不能配置bean,导致项目启动报错. 解决方法: 在VM options中设置虚拟机加 ...

  6. js-将传来的数据排序,让(全部)这个小按钮小圈圈,始终排列在最前面

    let arryDemo=[]; for(var i=0;i<data.data.length;i++){ if(data.data[i].name=='全部'){ arryDemo.push( ...

  7. asp.net实现大视频上传

    IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag 客户端每次提交下载请求时,服务 ...

  8. es之java分页操作

    按照一般的查询流程来说,如果我想查询前10条数据: · 1 客户端请求发给某个节点 · 2 节点转发给个个分片,查询每个分片上的前10条 · 3 结果返回给节点,整合数据,提取前10条 · 4 返回给 ...

  9. React-Native 之 GD (十九)TabBarItem 逻辑完善 / 关闭筛选菜单滑动手势 / Navigator 掉帧卡顿问题处理

    1.TabBarItem 逻辑完善 那么为了更好的用户体验,我们这边还需要来处理一下点击 TabBarItem 的一下细节,那就是当用户点击 Item 时,可能只是单纯的想进行页面的 切换或者置顶操作 ...

  10. The Linux usage model for device tree data

    Linux and the Device Tree The Linux usage model for device tree data Author: Grant Likely grant.like ...