vue组件

本是古典 何须时尚 2022-01-05 07:25 482阅读 0赞

定义Vue组件

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

组件化和模块化的不同:

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

一 全局组件定义的三种方式

  1. 使用 Vue.extend 配合 Vue.component 方法:

    1. 1.1 使用 Vue.extend 来创建全局的Vue组件
    2. 通过 template 属性,指定了组件要展示的HTML结构
    3. var login = Vue.extend({
    4. template: '<h1>登录</h1>'
    5. });
    6. 1.2 使用 Vue.component('组件的名称', 创建出来的组件模板对象)
    7. Vue.component('mycom1', login);
    8. 1.3 如果要使用组件,标签形式,引入自己的组件
    9. <mycom1></mycom1>
  2. 直接使用 Vue.component 方法:

    1. 定义:
    2. Vue.component('mycom2', {
    3. template: '<h1>注册</h1>'
    4. });
    5. 使用:
    6. 如果要使用组件,标签形式,引入自己的组件
    7. <mycom2></mycom2>
  3. 将模板字符串,定义到script标签种:
    第二种的基础上方便HTML的编写

    1. <script id="tmpl" type="x-template">
    2. <div><a href="#">登录</a> | <a href="#">注册</a></div>
    3. </script>

    同时,需要使用 Vue.component 来定义组件:

    1. Vue.component('account', {
    2. template: '#tmpl'
    3. });

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

二 组件中展示数据和响应事件

  1. 1. 组件可以有自己的 data 数据 methods
  2. 2. 组件的 data 实例的 data 有点不一样,实例中的 data 可以为一个对象,但是 组件中的 data 必须是一个方法
  3. 3. 组件中的 data 除了必须为一个方法之外,这个方法内部,还必须返回一个对象才行;
  4. 4. 组件中 data 数据,使用方式,和实例中的 data 使用方式完全一样!!!
  1. 在组件中,data需要被定义为一个方法,而不是一个对象了。例如:

    1. Vue.component('account', {
    2. template: '<h1>这是全局组件 --- {
    3. {msg}}</h1>',
    4. data() {
    5. return {
    6. msg: '组件自己的数据'
    7. }
    8. },
    9. methods:{
    10. login(){
    11. alert('点击了登录按钮');
    12. }
    13. }
    14. });
  2. 在子组件中,如果将模板字符串,定义到了script标签中,那么,要访问子组件身上的data属性中的值,需要使用this来访问;

【重点】为什么组件中的data属性必须定义为一个方法并返回一个对象

  1. 通过计数器案例演示

三 使用components属性定义局部子组件

  1. 组件实例定义方式:

    1. <script>
    2. // 创建 Vue 实例,得到 ViewModel
    3. var vm = new Vue({
    4. el: '#app',
    5. data: {},
    6. methods: {},
    7. components: { // 定义子组件
    8. account: { // account 组件
    9. template: '<div><h1>这是Account组件{
    10. {name}}</h1></div>', // 在这里使用定义的子组件
    11. components: { // 定义子组件的子组件
    12. login: { // login 组件
    13. template: "<h3>这是登录组件</h3>"
    14. }
    15. }
    16. }
    17. }
    18. });
    19. </script>
  2. 引用组件:

    1. <div id="app">
    2. <account></account>
    3. </div>

四 使用flag标识符结合v-ifv-else切换组件(只能切换2个)

  1. 页面结构:

    1. <div id="app">
    2. <input type="button" value="toggle" @click="flag=!flag">
    3. <my-com1 v-if="flag"></my-com1>
    4. <my-com2 v-else="flag"></my-com2>
    5. </div>
  2. Vue实例定义:

    1. <script>
    2. Vue.component('myCom1', {
    3. template: '<h3>奔波霸</h3>'
    4. })
    5. Vue.component('myCom2', {
    6. template: '<h3>霸波奔</h3>'
    7. })
    8. // 创建 Vue 实例,得到 ViewModel
    9. var vm = new Vue({
    10. el: '#app',
    11. data: {
    12. flag: true
    13. },
    14. methods: {}
    15. });
    16. </script>

五 使用:is属性来切换不同的子组件,并添加切换动画(通过mode属性)

  1. 组件实例定义方式:

    1. // 登录组件
    2. const login = Vue.extend({
    3. template: `<div>
    4. <h3>登录组件</h3>
    5. </div>`
    6. });
    7. Vue.component('login', login);
    8. // 注册组件
    9. const register = Vue.extend({
    10. template: `<div>
    11. <h3>注册组件</h3>
    12. </div>`
    13. });
    14. Vue.component('register', register);
    15. // 创建 Vue 实例,得到 ViewModel
    16. var vm = new Vue({
    17. el: '#app',
    18. data: { comName: 'login' },
    19. methods: {}
    20. });
  2. 使用component标签,来引用组件,并通过:is属性来指定要加载的组件:

    1. <div id="app">
    2. <a href="#" @click.prevent="comName='login'">登录</a>
    3. <a href="#" @click.prevent="comName='register'">注册</a>
    4. <hr>
    5. <transition mode="out-in">
    6. <component :is="comName"></component>
    7. </transition>
    8. </div>
  3. 添加切换样式:

    1. <style>
    2. .v-enter,
    3. .v-leave-to {
    4. opacity: 0;
    5. transform: translateX(30px);
    6. }
    7. .v-enter-active,
    8. .v-leave-active {
    9. position: absolute;
    10. transition: all 0.3s ease;
    11. }
    12. h3{
    13. margin: 0;
    14. }
    15. </style>

六 父组件向子组件传值

  1. 组件实例定义方式,注意:一定要使用props属性来定义父组件传递过来的数据

    1. <script>
    2. // 创建 Vue 实例,得到 ViewModel
    3. var vm = new Vue({
    4. el: '#app',
    5. data: {
    6. msg: '这是父组件中的消息'
    7. },
    8. components: {
    9. son: {
    10. template: '<h1>这是子组件 --- {
    11. {finfo}}</h1>',
    12. props: ['finfo']
    13. }
    14. }
    15. });
    16. </script>
  2. 使用v-bind或简化指令,将数据传递到子组件中:

    1. 通过 属性绑定(v-bind:) 的形式, 需要传递给 子组件的数据,
    2. 以属性绑定的形式,传递到子组件内部,供子组件使用
    3. <div id="app">
    4. <son :finfo="msg"></son>
    5. </div>
  3. data与props的区别

    1. 注意1 子组件中的 data 数据,并不是通过 父组件传递过来的,而是子组件自身私有的,
    2. 比如: 子组件通过 Ajax ,请求回来的数据,都可以放到 data 身上;
    3. 注意2 data 上的数据,都是可读可写的;
    4. props 中的数据,都是只读的,无法重新赋值

七 父组件向子组件传方法

1.定义一个字面量类型的 组件模板对象
2.创建vue实例,得到ViewModel,加载组件
3.template: 通过指定了一个 Id, 这个指定Id的 template 元素中的内容,当作 组件的HTML结构
4.在app控件中使用事件绑定机制传递方法
5.在子组件template模板中,通过自己的方法–调用传递进来的父组件的方法[this.$emit]

  1. var com2 = {
  2. template: '#tmpl', // 通过指定了一个 Id, 表示 说,要去加载 这个指定Id的 template 元素中的内容,当作 组件的HTML结构
  3. data() {
  4. return {
  5. sonmsg: { name: '小头儿子', age: 6 }
  6. }
  7. },
  8. methods: {
  9. myclick() {
  10. // 当点击子组件的按钮的时候,如何 拿到 父组件传递过来的 func 方法,并调用这个方法???
  11. // emit 英文原意: 是触发,调用、发射的意思
  12. // this.$emit('func123', 123, 456)
  13. this.$emit('func', this.sonmsg)
  14. }
  15. }
  16. }
  17. =============================================
  18. // 创建 Vue 实例,得到 ViewModel
  19. var vm = new Vue({
  20. el: '#app',
  21. data: {
  22. datamsgFormSon: null
  23. },
  24. methods: {
  25. show(data) {
  26. // console.log('调用了父组件身上的 show 方法: --- ' + data)
  27. // console.log(data);
  28. this.datamsgFormSon = data
  29. }
  30. },
  31. components: {
  32. com2
  33. // com2: com2
  34. }
  35. });
  36. =====================================
  37. <div id="app">
  38. <com2 @func="show"></com2>
  39. </div>
  40. =====================================
  41. <template id="tmpl">
  42. <div>
  43. <h1>这是 子组件</h1>
  44. <input type="button" value="这是子组件中的按钮 - 点击它,触发 父组件传递过来的 func 方法" @click="myclick">
  45. </div>
  46. </template>

八 子组件向父组件传值

  1. 原理:父组件将方法的引用,传递到子组件内部,子组件在内部调用父组件传递过来的方法,同时把要发送给父组件的数据,在调用方法的时候当作参数传递进去;
  2. 子组件内部通过this.$emit('方法名', 要传递的数据)方式,来调用父组件中的方法,同时把数据传递给父组件使用

    1. 在子组件方法中传入参数
    2. this.$emit('方法名', 123,456) data =123 data2 =456
    3. 在父类方法中接收参数
    4. var vm = new Vue({
    5. el: '#app',
    6. data: {
    7. datamsgFormSon: null
    8. },
    9. methods: {
    10. show(datadata2) {
    11. // console.log('调用了父组件身上的 show 方法: --- ' + data + data2)
    12. this.datamsgFormSon = data
    13. }
    14. }

九 评论列表案例

目标:主要练习父子组件之间传值

十 使用 this.$refs 来获取元素和组件(获取dom元素)

  1. <div id="app">
  2. <div>
  3. <input type="button" value="获取元素内容" @click="getElement" />
  4. <!-- 使用 ref 获取元素 -->
  5. <h1 ref="myh1">这是一个大大的H1</h1>
  6. <hr>
  7. <!-- 使用 ref 获取子组件 -->
  8. <my-com ref="mycom"></my-com>
  9. </div>
  10. </div>
  11. <script>
  12. Vue.component('my-com', {
  13. template: '<h5>这是一个子组件</h5>',
  14. data() {
  15. return {
  16. name: '子组件'
  17. }
  18. }
  19. });
  20. // 创建 Vue 实例,得到 ViewModel
  21. var vm = new Vue({
  22. el: '#app',
  23. data: {},
  24. methods: {
  25. getElement() {
  26. // 通过 this.$refs 来获取元素
  27. console.log(this.$refs.myh1.innerText);
  28. // 通过 this.$refs 来获取组件
  29. console.log(this.$refs.mycom.name);
  30. }
  31. }
  32. });
  33. </script>

发表评论

表情:
评论列表 (有 0 条评论,482人围观)

还没有评论,来说两句吧...

相关阅读

    相关 vue

    组件(Component)是Vue.js最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。所有的 Vue 组件同时也都是 Vue 的实例,所以可接受相同的选项对

    相关 vue

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

    相关 Vue

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

    相关 Vue

    为什么使用组件 JavaScript能力的复用。Vue.js的组件提高重复性,让代码可以复用。 组件的用法 组件在使用前先需要注册。注册分为两种方式:全局注册和局

    相关 Vue

    Vue组件 1. 什么是组件 1. 组件的概念:组件即自定义控件,是Vue.js最强大的功能之一 2. 组件的用途:组件能够封装可重用代码,扩展html标签功能