Vue基础精讲 —— Vue的组件之组件的定义、继承、自定义双向绑定、高级属性

2023-10-26

Vue组件基础定义

import Vue from 'vue'

const compoent = {
  props: {
    active: {
      // type: Boolean,
      // required: true,
      validator (value) {
        return typeof value === 'boolean'
      }
    },
    propOne: String
  },
  template: `
    <div>
      <input type="text" v-model="text">
      <span @click="handleChange">{{propOne}}</span>
      <span v-show="active">see me if active</span>
    </div>
  `,
  data () {
    return {
      text: 0
    }
  },
  methods: {
    handleChange () {
      this.$emit('changeY')
    }
  }
}

// Vue.component('CompOne', compoent)

new Vue({
  components: {
    CompOne: compoent
  },
  data: {
    prop1: 'test'
  },
  methods: {
    handleChange () {
      this.prop1 = this.prop1 + ' test'
    }
  },
  mounted () {
    console.log(this.$refs.comp1)
  },
  el: '#root',
  template: `
    <div>
      <p>{{prop1}}</p>
      <!--建议传递参用下划线命名,接收参数用驼峰-->
      <!--若传参是非string,需用:-->
      <!--@changeY="handleChange"接收子组件派发的change事件,这里不能@change-y="handleChange"这么写-->
      <comp-one ref="comp1" :active="true" :prop-one="prop1" @changeY="handleChange"></comp-one>
      <comp-one :active="true" propOne="text2"></comp-one>
    </div>
  `
})

Vue组件继承 

import Vue from 'vue'

const compoent = {
  props: {
    active: Boolean,
    propOne: String
  },
  template: `
    <div>
      <input type="text" v-model="text">
      <p @click="handleChange">propOne参数:{{propOne}}</p>
      <p v-show="active">see me if active</p>
    </div>
  `,
  data () {
    return {
      text: 0
    }
  },
  mounted () {
    console.log('compoent1 comp mounted')
  },
  methods: {
    handleChange () {
      this.$emit('change')
    }
  }
}

const componet2 = {
  extends: compoent, // 继承compoent
  data () {
    return {
      text: 1
    }
  },
  mounted () {
    console.log('componet2', this.$parent.$options.name)
  }
}

// const CompVue = Vue.extend(compoent)

// new CompVue({
//   el: '#root',
//   propsData: {
//     propOne: 'xxx'
//   },
//   data: {
//     text: '123'
//   },
//   mounted () {
//     console.log('instance mounted')
//   }
// })

const parent = new Vue({
  name: 'parent'
})

new Vue({
  parent: parent, // 设置父组件
  name: 'Root',
  el: '#root',
  mounted () {
    console.log('Root', this.$parent.$options.name)
  },
  components: {
    Comp: componet2
  },
  data: {
    text: '组件1'
  },
  methods: {
    change () {
      console.log('kkkkk')
    }
  },
  template: `
    <div>
      <span>{{text}}</span>
      <comp propOne="propOne" @change="change"></comp>
    </div>
  `
})

组件继承的执行顺序 

Vue自定义组件双向绑定

import Vue from 'vue'

const component = {
  // 使用model
  model: {
    // prop,子组件接收父组件通过v-model传递过来的值,可重命名为value22
    prop: 'value22',
    // event,该组件在派发emit 'change' 事件的时候,传递参数的值就是父组件v-model能够收到的值。
    event: 'change'
  },
  props: ['value22'], // model中得到的prop值
  template: `
    <div>
      <!--:value为props的值-->
      <input type="text" @input="handleInput" :value="value22">
    </div>
  `,
  methods: {
    handleInput (e) {
      // change为model中的event
      this.$emit('change', e.target.value)
    }
  }
  // 若不使用model接收父组件传参
  // props: ['value'], // 必须要使用value
  // template: `
  //   <div>
  //     <!--:value为props的值-->
  //     <input type="text" @input="handleInput" :value="value">
  //   </div>
  // `,
  // methods: {
  //   handleInput (e) {
  //     // 这儿必须用input发送数据,发送的数据会被父级v-model接收
  //     this.$emit('input', e.target.value)
  //   }
  // }
}

new Vue({
  components: {
    CompOne: component
  },
  el: '#root',
  data () {
    return {
      value11: '123'
    }
  },
  template: `
    <div>
      <!--将父组件数据通过v-model传递给子组件-->
      <comp-one v-model="value11"></comp-one>
    </div>
  `
})

Vue组件高级属性 

import Vue from 'vue'

const ChildComponent = {
  template: '<div>child component: {{data.value}}</div>',
  inject: ['yeye', 'data'], // 跨级组件沟通
  mounted () {
    // console.log(this.yeye, this.value)
  }
}

const component = {
  name: 'comp',
  components: {
    ChildComponent
  },
  // template: `
  //   <div :style="style">
  //     <div class="header">
  //       <slot name="header"></slot>
  //     </div>
  //     <div class="body">
  //       <slot name="body"></slot>
  //     </div>
  //   </div>
  // `,
  template: `
    <div :style="style">
      <slot :value="value" aaa="111"></slot>
      <child-component></child-component>
    </div>
  `,
  data () {
    return {
      style: {
        width: '200px',
        height: '200px',
        border: '1px solid #aaa'
      },
      value: 'component value'
    }
  }
}

new Vue({
  components: {
    CompOne: component
  },
  provide () {
    const data = {}

    Object.defineProperty(data, 'value', {
      get: () => this.value,
      enumerable: true
    })

    return {
      yeye: this,
      data
    }
  },
  el: '#root',
  data () {
    return {
      value: '123'
    }
  },
  mounted () {
    console.log(this.$refs.comp.value, this.$refs.span)
    // 打印vue实例,dom节点,ref用在组件和原生HTML上的区别
  },
  template: `
    <div>
      <comp-one ref="comp">
        <div slot-scope="props" ref="span">
          <P>子组件组件内部变量:{{props.value}} {{props.aaa}}</P>
          <P>当前组件变量:{{value}}</P>
        </div>
      </comp-one>
      <input type="text" v-model="value" />
    </div>
  `
})
// 匿名插槽
// 具名插槽
// 作用域插槽,父组件可使用子组件中的数据slot-scope

 

与君共勉:再牛逼的梦想,也抵不住傻逼般的坚持!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue基础精讲 —— Vue的组件之组件的定义、继承、自定义双向绑定、高级属性 的相关文章

  • wedo2.0编程模块介绍_西门子S7-200 SMART硬件和编程软件简介

    前文给大家简单的讲介绍了一下PLC编程涉及的一些概念型知识 本文开始实践 今天带来的是SIMATIC S7 200 SMART硬件和编程软件简介 SIMATIC S7 200 SMART 是西门子公司经过大量市场调研 为中国客户量身定制的一
  • Java 多线程 --- 按序打印

    Java 多线程 按序打印 方法1 控制变量 使用volatile关键字优化 方法2 synchronized wait notifyAll 方法3 信号量 给你一个类 public class Foo public void first
  • 【深度学习】参数量、模型大小、显存

    对于一个深度学习神经网络来说 其通常包含很多卷积层 用于不断提取目标的特征 或对目标进行最终定位或者分类 1 数据存储精度与存储空间 在深度学习神经网络中 最常见的数据格式是float32 占4个字节 Byte 类似地 float16 占2
  • std::condition_variable

    std condition variable std condition variable 是C 11提供的条件变量 可用于同时阻塞一个线程或多个线程 一般的 生产者线程利用支持std mutex的std lock guard std un
  • 【React Hook】一文让你彻底明白何为State Hook?

    使用 State Hook 下面的例子介绍了 Hook import React useState from react function Example 声明一个叫 count 的 state 变量 const count setCoun
  • 如何解除计算机的启动项,UEFI安全启动怎么关闭 关闭UEFI启动项的方法图解

    大家都知道现在很多电脑都预装win8系统 其系统都开启了UEFI安全启动选项 然而 对于不习惯win8操作界面的朋友来说 可能就会把win8改为win7 但是我们得知道Win8改装Win7需要在BIOS下关闭UEFI选项 如果OS选项已经关
  • ctfshow-萌赛

    目录 web 签到 给她 假声赛 web 签到 很明显的命令执行漏洞 我们把前后闭合即可 payload 1 ls 1 1 cat flag 1 给她 根据题目提示很容易就想到是 git泄露 直接用gitHack扫描题目地址 git 发现存
  • 电子科技大学人工智能期末复习笔记(二):MDP与强化学习

    目录 前言 期望最大搜索 Expectimax Search 马尔科夫决策 MDP offline 超重点 先来看一个例子 基本概念 政策 Policy 折扣 Discounting 如何停止循环 价值迭代 Value Iteration

随机推荐

  • LeetcodeSQL入门——知识点总结(选择/排序/修改/字符串处理/正则)

    LeetcodeSQL入门 选择 排序 修改 字符串处理 选择 sql语言对于空值的判断是IS NULL或者IS NOT NULL eg 某网站包含两个表 Customers 表和 Orders 表 编写一个 SQL 查询 找出所有从不订购
  • 剑指Offer 40

    使用优先队列 将非负数变为非正数存储 结果变成非负数 class Solution public int getLeastNumbers int arr int k if k 0 return new int 0 int nums new
  • SequenceInputStream----合并流

    这个类的作用是将多个输入流合并成一个输入流 通过SequenceInputStream类包装后形成新的一个总的输入流 1 SequenceInputStream InputStream s1 InputStream s2 和Sequence
  • 差分方程与滤波的实现

    1 滤波基础知识 2 差分方程 3 IIR滤波器 1 直接I型IIR滤波器 2 直接II型IIR滤波器
  • 备战2023蓝桥国赛-移动服务

    题目描述 解析 这道题我想复杂了 一开始我是这样想的 设dp i j 表示按顺序满足到第i个请求时 最初在j号点的人到达第i个请求的位置的情况下的最小花费 state i j 表示按顺序满足到第i个请求时 最初在j号点的人到达第i个请求的位
  • Typescript 之接口 interface(详解)

    一 interface的基本含义 TS新增了一个重要概念 接口 分为对象类型接口和函数类型接口 接口可以约束对象 函数 类的结构和类型 是一种代码协作必须遵守的契约 Interface 是一种描述对象或函数的东西 你可以把它理解为形状 一个
  • 使用github免费搭建个人博客后的写作及上传说明

    项目地址 我的博客github项目地址 个人博客网站 欢迎进入我的博客 本篇文章介绍如何在博客搭建好的基础上 使用它 使用它来写博客 更新博客页面 第一种方法 本地编辑 上传到github 首先 从我的github个人博客项目仓库克隆出该工
  • vscode中CommandNotFoundError: Your shell has not been properly configured to use ‘conda active的可能解决方法

    一 问题背景 如题 出现该问题后 我首先通过搜索尝试了conda init 用管理员身份运行powershell进行权限配置等方法无果 python之 vscode中激活conda虚拟环境报错或者打开虚拟环境失败 if using cond
  • 滑动时间窗口的思想和实现,环形数组,golang

    固定时间窗口 在开发限流组件的时候 我们需要统计一个时间区间内的请求数 比如以分钟为单位 所谓固定时间窗口 就是根据时间函数得到当前请求落在哪个分钟之内 我们在统计的时候只关注当前分钟之内的数量 即 0s 60s 因为流量并不是均匀的 所以
  • 微软RIA服务2009年7月预览版官方手册第2节(翻译:戴石麟)

    2 理解N层Silverlight应用项目 微软 NET RIA服务通过结合ASP NET和Silverlight平台来简化传统N层应用模式 应用逻辑写在中间层上 通过查询 更新 定制方法和服务操作来控制对数据的访问 NET RIA服务特性
  • Verilog入门学习笔记:Verilog基础语法梳理

    无论是学IC设计还是FPGA开发 Verilog都是最基本 最重要的必备技能 但任何一门编程语言的掌握都需要长期学习 并不是简简单单的随便读几本书 随便动动脑筋那么简单 Verilog是一门基于硬件的独特语言 由于它最终所实现的数字电路 具
  • netstat详解

    netstat是控制台命令 是一个监控TCP IP网络的非常有用的工具 它可以显示路由表 实际的网络连接以及每一个网络接口设备的状态信息 netstat可以用于显示与IP TCP UDP和ICMP协议相关的统计数据 一般用于检验本机各端口的
  • vb wor转存html,利用VB操作WORD的基本方法

    利用VB操作WORD的基本方法 通过查阅资料 自我实践 经实验通过 先引用word Application Dim MyWord As Word Application Dim MyWordBook As Word Document Set
  • Numpy:基础数据结构

    1 数组的基本属性 import numpy as np ar np array 1 2 3 4 5 6 7 print ar 输出数组 注意数组的格式 中括号 元素之间没有逗号 和列表区分 print ar ndim 输出数组维度的个数
  • Python @函数装饰器及用法(超级详细)转

    Python 内置的 3 种函数装饰器 分别是 staticmethod classmethod 和 property 其中 staticmethod classmethod 和 property 都是 Python 的内置函数 那么 我们
  • layui子弹框调用父弹框方法

    var thisFrame parent window document getElementById LAY layuiStampDuty1 getElementsByTagName iframe 0 id 获取父级弹框id值 var d
  • 【20220412】文献翻译4:交互中的手势和语言概述

    Gesture and speech in interaction An overview 1 简介 2 什么是共同语言 同声传译 手势 2 1 用手比划 2 2 用头做动作 3 语音和手势是交互的 3 1 交际环境中的手势 3 2 传递意
  • 双向链表

    双向就意味着对于每一个元素 都有两个方向的指向 因此从以下几个方面阐述双向链表 重要方法分析 全部代码 一 重要方法分析 这里的链表实现了我博客中的接口 ILinkedList 与结点 LinkedNode 具体的博客地址 http blo
  • 【Linux】VIM使用

    第一节 Vim常用操作 Vim没有菜单 只有命令 Vim的工作模式有三种 第一种 命令模式 vi vim 文件名 进入命令模式 不可以输入文字 只能识别命令 插入命令 a 在光标所在字符后插入 i 在光标所在字符前插入 o 在光标下插入新行
  • Vue基础精讲 —— Vue的组件之组件的定义、继承、自定义双向绑定、高级属性

    Vue组件基础定义 import Vue from vue const compoent props active type Boolean required true validator value return typeof value