Vue-day03 组件

1.组件机制

组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue的编译器为它添加特殊功能。在有些情况下,组件也可以表现为用is特性进行了扩展的原生 HTML 元素。组件注册的时候需要为该组件指定各种参数。

因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项。

### 组件的特点* 组件可以进行任意次数的复用。* 组件的data必须是一个函数,确保每个实例可以维护一份被返回对象的独立的拷贝,也就是任何一个组件的改变不会影响到其他组件。
let component = { data () { return { count: 0 } },template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>' 
}
一个组件的 data 选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝

2.组件注册

要想进行组件使用得先进行组件注册

  1. 全局注册
    可以使用Vue.component(tagName, options) 注册一个全局组件, 注册之后可以用在任何新创建的 Vue 根实例的模板中
    Vue.component(‘my-component-name’,component)

  2. 局部注册

全局注册往往是不够理想的。比如,如果你使用一个像 webpack 这样的构建系统,全局注册所有的组件意味着即便你已经不再使用一个组件了,它仍然会被包含在你最终的构建结果中。这造成了用户下载的 JavaScript 的无谓的增加。局部注册的组件只能在当前组件中使用

全局组件–>全局变量

局部组件–>局部变量

全局注册
### js代码// 1.创建组件let mycom = {data() {return {Commsg: '组件数据'}},methods:{changeObj(){if(this.Commsg==='组件数据'){this.Commsg='修改后的组件数据'}else{this.Commsg='组件数据'}}},// 模板template: `<div><br>组件使用<br>-------------------------<br><span>{{Commsg}}</span><span>{{Commsg}}</span><button @click='changeObj'>更改数据模型中的数据</button></div>`};// 全局注册Vue.component('my-com',mycom)new Vue({el: '#app',data: {}})
### html代码<div id="app"><my-com></my-com><my-com></my-com><my-com></my-com></div>
### 局部注册
### html代码<div id="app"><my-com-b></my-com-b>--------------------<my-com-a></my-com-a></div>
### js代码// 创建组件let myComA={// 模板template:`<div>A组件</div>`};let myComB={components:{'my-com-a':myComA},// 模板template:`<div>B组件<my-com-a></my-com-a></div>`};//全局注册//    Vue.component('my-com-a',myComA)Vue.component('my-com-b',myComB)new Vue({components:{'my-com-a':myComA},  el:'#app',data:{}})

3.组件交互/通信/传值

组件 A 在它的模板中使用了组件 B。它们之间必然需要相互通信:父组件可能要给子组件下发数据,子组件则可能要将它内部发生的事情告知父组件。在 Vue 中,父子组件的关系可以总结为 prop 向下传递,事件向上传递。父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息。

1.子组件内使用父组件数据 父-子

​ 1.父组件传递数据给子组件 (可以传递静态属性 动态属性 )

​ 2.子组件接收并处理数据

​ {

​ props:[‘title’,‘msg’,'attrA],

​ template:``

​ }

​ 2.父组件内使用子组件的数据

​ 事件发射 自定义事件

​ 在子组件内发射 在父组件内接受

​ 子组件发射时机

​ 1.手动按钮发送

​ 2.监听子组件内数据变化,然后发射

 在子组件内监听comMsg的变化,this.$emit('',this.comMsg)

父组件的事件处理程序调用,可以更改父组件数据模型中的数据,同步反映到父组件视图中

### 父组件传递数据给子组件
### html代码<div id="app"><!-- 父组件给子组件传递数据 --><my-com :msg='msg' title='父组件向子组件传值' attr-a='父组件给自组件的静态数据'></my-com></div>
### js代码// 创建组件let myCom={// 接受父组件传递的数据props:['title','msg','attrA'],data(){return {}},template:`<div>组件通信<br><span>{{msg}}--{{title}}--{{attrA}}</span></div>`}new Vue({components:{"my-com":myCom},el:"#app",data:{msg:'我是父组件'}})
### 子组件向父组件传递数据
### html代码<div id="app">{{msg}}<my-a title='父组件静态数据' :msg='msg' data-attr='父组件静态数据' @my-event='handler'>			</my-a></div></div>### js代码<script>// 创建组件let myA={props:['title','msg','dataAttr'],data(){return {subMsg:'子组件数据'}},methods:{toSend(){// 参数  第一个参数自定义事件名称 第二个参数传递的数据this.$emit('my-event',this.subMsg,100)}},template:`<div>{{subMsg}}--{{msg}}--{{dataAttr}}--<button @click='toSend'>发射数据</button></div>};// 全局注册Vue.component('my-a',myA)new Vue({el:"#app",data:{msg:'父组件数据'},methods: {handler(a,b){console.log(a,b)}},})

4.组件传值

父组件通过属性绑定的方式将参数传递给子组件,子组件通过props声明期望从父组件那里获取的参数。camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名) 命名:

希望每个prop都有指定的值类型。这时,你可以以对象形式列出prop,这些property的名称和值分别是prop各自的名称和类型

父组件给子组件数据的时候,子组件可以定义数据类型
静态传参:不加冒号,传字符串
动态传参:加冒号,传number、boolean、object、数组类型的值,变量

props: {
title: String,
likes: Number,
isPublished: Boolean,
commentIds: Array,
author: Object,
callback: Function,
contactsPromise: Promise // or any other constructor
}

prop验证

​ 我们可以为组件的 prop 指定验证要求,例如你知道的这些类型。如果有一个需求没有被满足,则 Vue 会在浏览器控制台中警告你。这在开发一个会被别人用到的组件时尤其有帮助。

Vue.component(‘my-component’, {
props: {
// 基础的类型检查 (nullundefined 会通过任何类型验证)
propA: Number,
// 多个可能的类型
propB: [String, Number],
// 必填的字符串
propC: { type: String, required: true },
// 带有默认值的数字
propD: { type: Number, default: 100 }
})

### js代码// 创建组件let myA={props:['title','msg'],data(){return {subMsg:'子组件' }},template:`<div>{{title}}-{{msg}}</div>`}Vue.component('my-a',myA)new Vue({el:'#app',data:{msg:'父组件'}})
### html代码<div id="app">{{msg}}<my-a title='hello' :msg='msg' ></my-a></div>
### html代码
<div id="app">{{msg}}<!-- <my-a sub-msg="父给子" :stus="[1,2,3]" :is-active="undefined"></my-a> --><!-- <my-a sub-msg="父给子" :stus="[1,2,3]" :is-active="true"></my-a> --><my-a :msg="msg" sub-msg="父给子" :is-active="true" :age="80"></my-a></div>
### js代码
let myA = {props: {msg: String,subMsg: String,// stus: Array,stus: {type: Array,// 错误// default: [6, 7, 8]// 正确  Object/Array要一个工厂函数返回默认值default() {return [6, 7, 8];}},// isActive: BooleanisActive: [String, Boolean],name: {type: String,// 必填项// required: truedefault: "lisi"},// 自定义校验规则age: {type: Number,// 校验器 // value 是形参,实参是将来父组件给子组件传递的数据validator(value) {/* if(value>50){return true;}else{return false;} */return value > 50;}}},template: `<div>{{subMsg}}{{stus}}{{isActive}}  {{name}}{{age}}{{msg}}</div>`};Vue.component('my-a', myA);let vm = new Vue({el: '#app',data: {msg: 'hello'},methods: {}})

单向数据流(数据更改的方向)

父组件可以改给子组件的数据
父改子可以
子组件不可以改父组件的数据
子改父不行

修改父组件的msg 子组件的msg跟着修改但是反过来不行

vm.msg=‘hello vue’ 观察子组件的变化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/37259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt和xmind结合起来帮你制作精美的思维导图

介绍 chatgpt和xmind结合起来帮你制作精美的思维导图。 1.输出Markdown格式 2.xmind导入.md文件

web集群学习:nginx+keepalived实现负载均衡高可用性

目录 项目架构 一&#xff0c;环境介绍 二&#xff0c;项目部署 在Web服务器上配置Web测试页面 nginx负载均衡配置 配置Nginx_Master 通过vrrp_script实现对集群资源的监控&#xff08;1>通过killall命令探测服务运行状态&#xff09; 通过vrrp_script实现对集群资源…

div输入框的文字超过指定行数用省略号表示css

实现效果&#xff1a;超过四行用省略号表示 实现方法&#xff1a; .text{overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 4; // 自定义行数-webkit-box-orient: vertical; }

Go和Java实现外观模式

Go和Java实现外观模式 下面我们通过一个构造各种形状的案例来说明外观模式的使用。 1、外观模式 外观模式隐藏系统的复杂性&#xff0c;并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型 模式&#xff0c;它向现有的系统添加一个接口&#xff…

【设计模式】代理模式

在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。 介绍 意图&#xff1a;为其他对象提供一种代理以…

【面试问题】事务中执行了异步任务分发数据,由于事务未提交,导致异步任务无法执行

文章目录 问题描述&#xff1a;解决办法&#xff1a; 问题描述&#xff1a; OverrideTransactional(rollbackFor Exception.class)public ServiceResponse ctsqCallbackProcess(OaFlowRecord params) {// 查询任务单数据// 更新任务单信息// 异步分发数据到CRMS系统}客户数据分…

TX Text Control .NET Server for ASP.NET Crack

TX Text Control .NET Server for ASP.NET Crack TX Text Control.NET Server for ASP.NET是用于Web应用程序或服务的服务器端组件。它是一个完全可编程的ASP.NET文字处理引擎&#xff0c;提供了广泛的文字处理功能。使用TX Text Control.NET Server&#xff0c;程序员可以开发…

react组件化开发详解

React是一个流行的JavaScript库&#xff0c;用于构建用户界面&#xff0c;并且以组件化的方式进行开发。下面将详解React组件化开发的概念和步骤&#xff1a; 组件化思维&#xff1a; 组件化开发是将复杂的用户界面划分为独立、可重用的小部件&#xff08;组件&#xff09;。…

【833. 字符串中的查找与替换】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 你会得到一个字符串 s (索引从 0 开始)&#xff0c;你必须对它执行 k 个替换操作。替换操作以三个长度均为 k 的并行数组给出&#xff1a;indices, sources, targets。 要完成第 i 个替换操作: 检查…

Spring事务传播机制

hi ,大家好,继续为大家带来Spring事务传播机制的相关知识 文章目录 &#x1f917;1.事务传播机制是什么&#x1f917;2.事务传播机制作用&#x1f917;3.事务传播机制 &#x1f917;1.事务传播机制是什么 定义了多个包含了事务的⽅法&#xff0c;相互调⽤时&#xff0c;事务是…

C++教程 - How to C++系列专栏第3篇

关于专栏 这个专栏是优质的C教程专栏&#xff0c;如果你还没看过第0篇&#xff0c;点击C教程 - How to C系列专栏第0篇去第0篇 本专栏一致使用操作系统&#xff1a;macOS Ventura&#xff0c;代码编辑器&#xff1a;CLion&#xff0c;C编译器&#xff1a;Clang 感谢一路相伴…

[C++ 网络协议编程] UDP协议

目录 1. UDP和TCP的区别 2. UDP的工作原理 3. UDP存在数据边界 4. UDP的I/O函数 4.1 sendto函数 4.2 recvfrom函数 4. 已连接(connected)UDP套接字和未连接(unconnected)UDP套接字 5. UDP的通信流程 5.1 服务器端通信流程 5.2 客户端通信流程 1. UDP和TCP的区别 主要…

从安全角度分析Angular本地存储

随着Web应用程序的不断增长&#xff0c;前端开发人员慢慢意识到使用浏览器提供的本地存储技术可以在不使用外部数据库的情况下方便地保存应用程序的数据。Angular作为目前最流行的前端框架之一&#xff0c;也在其API中提供了许多本地存储技术的支持。但是&#xff0c;在使用本地…

Electron教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Electron是一个是使用JavaScript&#xff0c;HTML和CSS构建跨平台的桌面应用程序框架。 Electron 通过将 Chromium 和 Node.js 合并到同一个运行时环境中&#xff0c;并将其打包为 Mac&#xff0c;Windows 和 Linux 系统下的应用来实现这一目的。 Electron入门教程 …

【深度学习】日常笔记16

可以将pd.DataFrame数据结构理解为类似于Excel中的表格。pd.DataFrame是pandas库提供的一个二维数据结构&#xff0c;用于存储和操作具有行和列的数据。它类似于Excel中的工作表&#xff0c;其中每一列可以是不同的数据类型&#xff08;例如整数、浮点数、字符串等&#xff09;…

关于安卓打包生成aar,jar实现(一)

关于安卓打包生成aar&#xff0c;jar方式 背景 在开发的过程中&#xff0c;主项目引入三方功能的方式有很多&#xff0c;主要是以下几个方面&#xff1a; &#xff08;1&#xff09;直接引入源代码module&#xff08;优点&#xff1a;方便修改源码&#xff0c;易于维护&#…

Spring_AOP

一、AOP简介 AOP&#xff0c;Aspect Oriented Programming,面向切面编程,是对面向对象编程0OP的升华。OOP是纵向对一个事物的抽象&#xff0c;一个对象包括静态的属性信息&#xff0c;包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性、方法与方法、对象与对象…

算法训练营题目day17

110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 func isBalanced(root *TreeNode) bool {h:getHeight(root)if h -1{r…

Vue 安装开发者工具

1.下载开发者工具&#xff0c;下载地址&#xff1a;http://book.wiyp.top/App/Vue3开发者工具-谷歌/Vue3.crx 2.打开谷歌浏览器&#xff0c;点击扩展&#xff0c;点击管理扩展程序。 3.开启开发者模式&#xff0c;将 Vue3 开发者工具文件拖拽到浏览器中进行安装。 注&#xff…

chatGPT小白快速入门培训课程-001

一、前言 本文是《chatGPT小白快速入门培训课程》的第001篇文章&#xff0c;全部内容采用chatGPT和chatGPT开源平替软件生成。完整内容大纲详见&#xff1a;《chatGPT小白快速入门课程大纲》。 本系列文章&#xff0c;参与&#xff1a; AIGC征文活动 #AIGC技术创作内容征文# …