当前位置: 首页 > news >正文

Vue组件定义

简介

组件是可复用的 Vue 实例。

本质上是一个对象,该对象包含datacomputedwatchmethodsfilters以及生命周期钩子等成员属性。

组件结构:

{
  data(){
    return {
      //
    }
  },
  computed:{
    displayName(){
      return '';
    }
  },
  methods:{
    onClickHandler(params){
      // do something
    }
  }
}

基础知识

data属性

  • data属性维护一个组件内部状态,其余组件正常情况下不可见。

    • 可以通过props传递给子组件;
    • 可以通过$emit的方式传递给父组件;
    • 可以通过this.$refs.ref.$datamounted生命周期内获取子组件的内部状态;

      • 目前不知道如何监听其变化;
      • 因为计算属性computed和侦听属性watch只能监听 响应式依赖 的变化,而$refs非响应式。
  • 一个组件的 data 选项必须是一个函数

      data选项有两种定义方式:
      
      一、对象形式:
      
      ```
      data:{
        //引用该组件的地方,共用一个状态的引用,以至于,只要有一处修改了$data中的某一属性值,其它引用该组件的地方也跟随着改变该属性值(其实,不是跟随,本来就是同一个指向)。
      }
      ```
      
      二、函数形式:
      
      ```
      data(){
        return {
          //引用该组件的地方,每一个组件都会获得独立的引用,互不干扰。
        }
      }
      ```
    

computed属性 VS methods属性 VS filter

区别methodcomputedfilter
类型函数数据变量函数
用途作事件处理函数作数据作管道符
作用范围组建内组建内组建内(局部注册)、全局(全局注册)
参数可以带参不带参(非函)带参
返回值不要求必须有必须有
触发交互时触发在它的相关依赖发生改变时才会重新求值传入的数据变化时执行

注意:

  • Vue中并不是所有的属性都是响应式的,如$refs无法监听它的变动;

组件构建的主要区别在于模板的生成方式

模板定义方式

template选项

字符串模板

  • 以HTML标签结构组成的字符串;
  • 示例:
{
  template: '<h1 v-if="level === 1">简单示例</h1>',
  props: {
    level: {
      type: Number,
      required: true
    }
  }
}

id选择器指定的模板

  • id标识的一段script标签包裹的HTML片段;
  • 示例:
<script type="text/x-template" id="anchored-heading-template">
  <h1 v-if="level === 1">
    简单示例
  </h1>
</script>
{
  template: '#anchored-heading-template',
  props: {
    level: {
      type: Number,
      required: true
    }
  }
}

render

  • 发挥JavaScript最大的编程能力,该函数接收一个createElement方法作为第一个参数用来创建VNode
  • createElement接收三个参数:组件根节点类型、组件配置对象、子节点(官方关于组件配置对象的说明);
  • 示例:
{
  render: function (createElement) {
    return createElement(
      'h' + this.level,   // tag name 标签名称
      this.$slots.default // 子组件中的阵列
    )
  },
  props: {
    level: {
      type: Number,
      required: true
    }
  }
}

单文件组件

单文件组件将模板、逻辑、样式在结构上分离,保存在同一个文件中。

<template>
  <div>
    ...
  </div>
</template>
<script>
...
export default{
  ...
}
...
</script>
<style>
...
</style>

方案选择

template单文件render
一行的简单结构常规的选择前边两种方案解决不了时候的选择(灵活性高)

注意:

  • 不论选择哪一种方案,定义模板时,一定要有一个非template标签元素作根DOM,有且仅有一个。

组件注册方式

局部注册

以上几种方案定义的组件本质上都是一个对象,获取该对象(假设变量名为TabBar),要求只在另一个组件(假设变量名为App)内使用:

App组件的配置对象:

{
  components:{
    'tab-bar': TabBar,
  }
}

这样就是局部注册,该组件TabBar只能在App模板中使用<tab-bar></tab-bar>,其它组件对TabBar不可见。

全局注册

以上几种方案定义的组件本质上都是一个对象,获取该对象(假设变量名为TabBar),要求项目内任何组件可使用:

一般在项目的入口文件(如:脚手架搭建项目的main.js)中:

Vue.component('tab-bar',TabBar);

这样就是全局注册,该组件TabBar能在整个项目内使用<tab-bar></tab-bar>,所有组件对TabBar可见。

生命周期钩子

以下用自己的语言将生命周期钩子表述一下,如果有不对的地方,请校正:

生命周期钩子

beforeCreate

在这个时候,生命周期函数已经准备好。

  • 组件实例已经构建,但本组件实例的数据、方法还没有注入;
  • 可以在各个生命周期内通过组件实例this调用根实例上注入的$router$store等对象。
  • 可以在本生命周期内进行数据初始化;

created

在这个时候,当前组件实例this上的属性($dataprops$methods...)已经注入绑定,可以调用本实例上的成员属性;

beforeMount

在进入本生命周期之前,会进行以下判断:

  • 是否有el选项(指定挂载目标):

    • el选项的是根实例;
    • 没有el选项的是非根实例(默认挂载元素为组件调用的位置);
  • 是否有template选项:

    • template选项的是内联模板;
    • 没有template选项的是单文件组件;
    • 个人觉得,还有render选项的判断;

最终这些模板都会转换为render函数进行渲染!!!

  • 这个生命周期在解析模板,不知道有什么实际用途。

mounted

在本生命周期之前,已经将模板渲染为真实DOM,其中vm.$el组件实例的根DOM元素

  • 本生命周期是初始化第三方插件的场所;
  • 必要时候,可以在本生命周期内对DOM进行操作;
  • 本生命周期是获取this.$refs.ref的场所;

相关文章:

  • SQL Server删除distribution数据库
  • 数据驱动的数字化转型:从流程驱动到数据驱动
  • vuex简单总结
  • 两种方式 : VS 如何调试dll中的源码
  • 第四课:Yarn和Map/Reduce配置启动和原理讲解
  • 8.6 11.25-11.27
  • python学习之老男孩python全栈第九期_数据库day001 -- 作业
  • php计算 处理丢失精度问题 保留小数
  • 古诗文网站的网络爬虫编写方式,通过网络爬虫抓去内容
  • MySQL基础知识之增删改查
  • Kotlin进阶(二)中缀、内联、高阶函数
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 【MySQL 5.7参考手册】8.14.2 General Thread States
  • 深入浅出的webpack构建工具---devTool中SourceMap模式详解(四)
  • 常见大数据系统所要解决问题的简要汇总
  • Android 架构优化~MVP 架构改造
  • codis proxy处理流程
  •  D - 粉碎叛乱F - 其他起义
  • gitlab-ci配置详解(一)
  • k8s 面向应用开发者的基础命令
  • Linux后台研发超实用命令总结
  • mysql 数据库四种事务隔离级别
  • Python打包系统简单入门
  • Twitter赢在开放,三年创造奇迹
  • webpack项目中使用grunt监听文件变动自动打包编译
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 来,膜拜下android roadmap,强大的执行力
  • 前端路由实现-history
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 我是如何设计 Upload 上传组件的
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​决定德拉瓦州地区版图的关键历史事件
  • #{} 和 ${}区别
  • #include到底该写在哪
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (C语言)fgets与fputs函数详解
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • *1 计算机基础和操作系统基础及几大协议
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .form文件_一篇文章学会文件上传
  • .gitignore
  • .NET Core 项目指定SDK版本
  • .NET 回调、接口回调、 委托
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .net和jar包windows服务部署
  • .Net环境下的缓存技术介绍
  • .net经典笔试题
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • @hook扩展分析