单个根元素

当构建一个 <blog-post> 组件时,你的模板最终会包含的东西远不止一个标题:

<h3>{{ title }}</h3>

最最起码,你会包含这篇博文的正文:

<h3>{{ title }}</h3> <div v-html="content"></div>

然而如果你在模板中尝试这样写,Vue 会显示一个错误,并解释道 every component must have a single root element (每个组件必须只有一个根元素)。你可以将模板的内容包裹在一个父元素内,来修复这个问题,例如:

<div class="blog-post"> <h3>{{ title }}</h3> <div v-html="content"></div> </div>

组件嵌套

<div id="app"> <h1>商品列表</h1> <goods-list /> </div>

//子组件 var subCom = { data:function () { return { goodslist:["铅笔","钢笔","毛笔"] } }, template:`<ul><li v-for="name in goodslist">{{name}}</li></ul>` } //父组件 let parentCom = { data:function () { return { title:"生活用品" } }, components:{ subCom:subCom }, template:`<div><h2>{{title}}</h2><sub-com /></div>` }; var vm = new Vue({ el:"#app", data:{}, components:{ goodsList:parentCom } });

组件嵌套props

<div id="app"> <h1>商品列表</h1> <pen-type ></pen-type> <hr/> <shoes-type></shoes-type> </div>

//第一套组件<pen-type ></pen-type>

var pens = { // name:"pens", data:function () { return { goodslist:["铅笔","钢笔","毛笔","毛笔1"] } }, template:`<ul><li v-for="name in goodslist">{{name}}</li></ul>` } let penType = { <!-- name:"penType", --> data:function () { return {title:"办公用品"} }, components:{ myPens:pens }, template:`<div><h2>{{title}}</h2><my-pens ></my-pens></div>` };

//第二套组件<shoes-type></shoes-type>

var shoes = { <!-- name:"shoes", --> data:function () { return {goodslist:["李宁鞋","跑鞋","白鞋"]} }, template:`<ul><li v-for="name in goodslist">{{name}}</li></ul>` } let shoesType = { <!-- name:"shoesType", --> data:function () { return {title:"鞋子"} }, components:{ myShoes:shoes }, template:`<div><h1>{{title}}</h1><my-shoes></my-shoes></div>` }; var vm = new Vue({ el:"#app", data:{}, components:{ penType:penType, shoesType:shoesType } });

props

通过prop父组件向子组件传递数据,即父给子传值

prop的作用是父组件中引用了子组件并给子组件加了一个属性,这个属性可以是静态的,可以是动态的,可以是数字,可以是字符串,可以是数组,还可以是对象。

<div id="app"> <h1>商品列表</h1> <shoes-type v-for="item in goods" :type="item.type" :goodslist="item.goodslist"></shoes-type> <!-- 报错信息 --> <!-- Property or method "type" is not defined on the instance but referenced during render. --> <!-- <shoes-type :type="type" :goodslist="goodslist"></shoes-type> --> </div>

var shoes = { name:"shoes", props:['goodslist'], data:function () { return {} }, template:`<ul><li v-for="name in goodslist">{{name}}</li></ul>` }

let shoesType = { props:['type',"goodslist"], //定义了形参 data:function () { return {} }, components:{ <!-- // 若不用这个组件,就没有组件的嵌套 --> <!-- // myShoes:shoes --> myShoes:shoes }, template:`<div> <h2>{{type}}</h2> <!-- 没有组件的嵌套,直接在此组件进行数据处理 --> <!-- <ul><li v-for="name in goodslist">{{name}}</li></ul> --> <my-shoes v-bind:goodslist="goodslist"></my-shoes> </div>` };

var vm = new Vue({ el:"#app", data:{ goods:[ { type:"生活用品", goodslist:['牙刷','牙岗','牙膏'] }, { type:"文具", goodslist:['铅笔','钢笔','毛笔'] }, { type:"电器", goodslist:['空调','冰箱','洗衣机',"电视"] }, { type:"鲜花", goodslist:['玫瑰花','百合花','喇叭花'] } ] }, components:{ shoesType:shoesType } });

自定义事件传值

子组件传给父组件

<div id="app"> <p>我是p</p> <div v-on:click="">{{total}}</div> <button-counter :href="aaa" v-on:increment="incrementTotal" ></button-counter> </div>

//定义子组件 var buttonCounter = { props:['href'], data:function () { return { count:0 } }, methods:{ clickfunc:function(){ this.count+=2; this.$emit("increment",this.count);//触发事件increment。 } }, template:`<div><h1>按钮</h1> <input type="button" value="点击" v-on:click="clickfunc" /> </div>` }

let vm = new Vue({ el:"#app", data:{ total:0, aaa:"hello" }, components:{ buttonCounter:buttonCounter }, methods:{ incrementTotal:function(t){ this.total++; console.log(t); }, a:function(){ alert(this.total); } } });

组件:

1、一个组件就是一个包含了html,css和js的独立的功能。

2、定义组件,就是在定义自定义标签。

3、使用组件,就是在使用自定义标签。

4、一个vue组件就是一个vue对象。每个组件有自己的data,也有自己的template(html)。

5、props:父给子传:组件的属性(自定义标签的属性),就是props(propertys)。父组件给子组件传值,父给子传:自定义属性;子接父的数据:props。

Props就是property的复数,就是属性的意思,在子组件里写props就相当于给子组件声明了若干个属性。

如:let img={

props:['src','alt','style']

}

就是告诉浏览器,img标签,有三个属性,分别是:src,alt,style。

6、组件的自定义事件:子给父传:

(1)       给子组件(标签)自定义一个事件。

(2)       子组件(标签)需要有触发自定义事件时机(代码)

(3)       给子组件的事件需要绑定一个函数(函数是在父组件里写的)

自定义组件的v-model

<div id="app"> <base-checkbox v-bind:checked="ischecked" v-on:change="showf"></base-checkbox> <span>{{ischecked?"是":"否"}}</span> </div>

Vue.component('base-checkbox', { model: { prop: 'checked', event: 'change' }, props: { checked: Boolean }, template: `<input type="checkbox" v-bind:checked="checked" v-on:change="$emit('change', $event.target.checked)" >` });

let vm = new Vue({ el:"#app", data:{ ischecked:true, msg:"hello" }, methods:{ showf:function (t) { this.ischecked = t; } } });

插槽(v-slot)

插槽内容:即<slot></slot>中的内容

编译作用域:父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

后备内容:有时为一个插槽设置具体的后备 (也就是默认的) 内容是很有用的,它只会在没有提供内容的时候被渲染。

<slot>{{msg}}</slot>中的{{msg}}即后备内容

<div id="app"> <p> {{msg}}</p> <navigation-link url="/profile" ><p>我是自定义<i>{{msg}}</i>标签的内容</p></navigation-link> </div>

let navigationLink= { props:['url'], data:function(){ return { msg:"子组件数据:hi" } }, template:` <a v-bind:href="url" class="nav-link"> 我在插槽前,<slot>{{msg}}</slot> <!-- 若body,或者父组件的innerhtml无内容,则默认显示<slot></slot>标签中的内容 --> <!-- 若body,或者父组件的innerhtml有内容,则<slot></slot>标签中的内容会被替代 --> ,我在插槽后</a>` }

let vm = new Vue({ el:"#app", data:{ msg:"父组件数据:hello" }, components:{//局部注册组件 navigationLink:navigationLink } });

具名插槽

<slot> 元素有一个特殊的特性:name。这个特性可以用来定义额外的插槽

在向具名插槽提供内容的时候,我们可以在一个 <template> 元素上使用 v-slot 指令,并以 v-slot 的参数的形式提供其名称

任何没有被包裹在带有 v-slot的 <template> 中的内容都会被视为默认插槽的内容。

注意 v-slot 只能添加在一个 <template> 上 (只有一种例外情况)

<div id="app"> <sub-com> <template v-slot:firstp>我是第一个p</template> <template v-slot:secondp>我是第二个p</template> <template v-slot:thirdp></template> </sub-com> </div>

let subCom= { data:function(){ return {} }, template:`<div> <p><slot name="firstp">1</slot></p> <hr/> <p><slot name="secondp">2</slot></p> <hr/> <p><slot name="thirdp">3</slot></p></div>` } let vm = new Vue({ el:"#app", data:{ }, components:{//局部注册组件 subCom:subCom } });

作用域插槽

有时让插槽内容能够访问子组件中才有的数据是很有用的,我们想让它的后备内容显示用户的名,以取代正常情况下用户的姓

<div id="app"> <sub-com> <!-- 法一: --> <!-- default:默认 --> <!-- <template v-slot:default="slotProps"> --> <!-- 法二: --> <template v-slot:n="slotProps"> {{slotProps.user.firstName}} </template> </sub-com> </div>

let subCom= { data:function(){ return { user:{ firstName:"江", lastname:"河" } } }, template:`<div> // 法一: // <p><slot v-bind:user="user">{{user.lastname}}</slot></p> // 法二: <p><slot name="n" v-bind:user="user">{{user.lastname}}</slot></p> </div>` } let vm = new Vue({ el:"#app", data:{ }, components:{//局部注册组件 subCom:subCom } });

动态组件

<div id="app"> <input type="button" value="切歌" @click="changeGe" /><br/> <component v-bind:is="currentCom" ></component> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

let comA= { data:function(){return {}}, template:`<div><p>a组件</p></div>` } let comB= { data:function(){return {}}, template:`<div><p>b组件</p></div>` } let vm = new Vue({ el:"#app", data:{ currentCom:comB }, components:{ comA,comB }, methods:{ changeGe:function(){ this.currentCom = (this.currentCom==comB?comA:comB); } } });

一、定义组件,就是在定义标签

二、一个完整的标签(如:img标签)包括:标签名,标签的属性,标签事件,标签的内容,

所以,在定义标签时,就需要明确标签的名字是什么,标签有哪些属性,以及属性名是什么(表示啥意思),属性值怎么呈现;标签有哪些自定义事件以及事件的触发时机;标签的内容应该显示在何处。分别由vue中的props,$emit, slot完成。

1、标签的属性名用props声明(父组件使用自定义属性时,值就传入子组件。)

2、自定义事件的触发用 this.$emit(‘自定义事件名’); (父组件使用自定义事件时,调用的函数是父组件的函数),这样:子组件就能给父组件传值了。

3、标签内容,显示在(插在)slot的位置。即在子组件的模板里的slot标签,就是子组件innerHTML展示的位置。

vue-03-传值,组件属性、事件、内容相关推荐

  1. vue 所有按钮属性、vue Button 所有按钮属性事件、vue a-button 所有按钮属性事件、vue 按钮所有属性事件、vue

    vue 所有按钮属性.vue Button 所有按钮属性事件.vue a-button 所有按钮属性事件.vue 按钮所有属性事件.vue 1.组件注册 1.按钮类型 2.按钮组合 3.不可用状态 4 ...

  2. Dcloud 全栈之旅1-5 组件属性-事件@

      组件事件@用法 我们先说下事件是做什么用的,来看看官方的解释 每个组件都有"事件".事件就是在指定的条件下触发某个js方法. 比如button组件,有点击事件,也就是当手机用户 ...

  3. vue中使用组件时事件想要传递其他参数的问题

    今天在用ant design 的组件时其封装好的事件已经包含了参数,而我需要在该事件中传index判断点击的第几个元素的事件 经过查询资料结果 <a-tree-select:disabled=& ...

  4. 关于解决vue.js中组件的template内容不能换行的问题

    template的内容引用不能用单引号'':要用` `(着重符,感叹号左边的键). template: `<transition name="fade"><slo ...

  5. 四、Vue组件化开发学习笔记——父子组件通信,父级向子级传值(props),子级向父级传值(自定义事件),slot插槽

    一.父子组件的通信 在上一篇博文中,我们提到了子组件是不能引用父组件或者Vue实例的数据的. 但是,在开发中,往往一些数据确实需要从上层传递到下层: 比如在一个页面中,我们从服务器请求到了很多的数据. ...

  6. vue中传值和传引用_vue prop属性传值与传引用示例

    vue prop属性传值与传引用示例 vue组件在prop里根据type决定传值还是传引用. 简要如下: 传值:String.Number.Boolean 传引用:Array.Object 若想将数组 ...

  7. Vue.js 父组件向子组件传值和子组件向父组件传值

    父组件向子组件传值 组件实例定义方式,注意:一定要使用props属性来定义父组件传递过来的数据 <script>// 创建 Vue 实例,得到 ViewModelvar vm = new ...

  8. 通过大头儿子和小头爸爸,给女朋友讲明白了vue中父子组件的传值

    写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...

  9. 组件间数据交互||父组件向子组件传值-基本使用|| 父组件向子组件传值-props属性名规则

    组件间数据交互 父组件向子组件传值 1. 组件内部通过props接收传递过来的值 2. 父组件通过属性将值传递给子组件 父组件向子组件传值-基本使用 <!DOCTYPE html> < ...

最新文章

  1. 新书 | 经典教材应用随机过程出第12版啦!
  2. array,vector对象 数组越界检测
  3. 文件上传--Smartupload上传组件【上】
  4. 2.6 datetime 模块
  5. dockerfile安装yum_Docker镜像-基于DockerFile制作yum版nginx镜像
  6. u-boot中添加自定义命令
  7. java抽象类实现接口可以不用实现方法
  8. 最优化学习笔记(四)——最速下降法
  9. 如何用sklearn创建机器学习分类器?这里有一份上手指南
  10. java设计模式之 装饰器模式
  11. java 区间api_Java 常用API(一)
  12. 杰克·韦尔奇的101条经典语录
  13. java 字符串替换
  14. 【MOOC手写体】王文敏教授.《人工智能原理》 第10章 机器学习的任务 Part5 C10.1...
  15. python的selenium的带https安全隐私问题解决方案
  16. React中Mpegts播放器的使用
  17. Neo4j-Cypher
  18. 疫情期间如何做到远程监控,实现设备的“智慧把守”?
  19. Win11 Excel文件变成白板图标怎么解决?
  20. UART(Universal Asynchronous Receiver/Transmitter,异步收发传输器)

热门文章

  1. PPT演讲的准备工作
  2. Cannot find module ‘fs/promises‘
  3. 大数据架构-使用HBase和Solr将存储与索引放在不同的机器上
  4. Scriptable脚本——网易云热评2.0
  5. linux psycopg2,[Linux][Python][psycopg2]脱机安装问题,LinuxPythonpsycopg2,离线
  6. vhdl语言入门——全加器实现
  7. matlab矩阵乘法结果出错,为啥矩阵乘法显示矩阵乘法维度不正确?是什么原因?...
  8. c语言砍头游戏,太牛了!给皇帝玩一个小游戏,就让他接受了一个有砍头之罪的建议...
  9. 美团2021校招 技术综合-后台方向-编程题随笔
  10. Twisted高级话题的学习