前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue组件的操作-自定义组件,动态组件,递归组件

Vue组件的操作-自定义组件,动态组件,递归组件

作者头像
达达前端
发布2019-12-20 11:15:01
2K0
发布2019-12-20 11:15:01
举报
文章被收录于专栏:达达前端达达前端

作者 | Jeskson

来源 | 达达前端小酒馆

v-model双向绑定

创建双向数据绑定,v-model指令用来在input,select,checkbox,radio等表单控件。v-model指令在内部使用不同的属性为不同的输入元素抛出不同的事件。

v-mdel指令实现数据的双向绑定:

代码语言:javascript
复制
<div>
 用户名:<input type="text" v-model="name">
</div>

输入用户名是:{{name}}

<div id="app">

<div>
 用户名:
 <input type="text" v-bind:value="name"
 @input="name = $event.target.value">
</div>

用户名:{{name}}

组件中的表单控件:

代码语言:javascript
复制
<input type="text" value="value"
@input = "handleinput($event.target.value)">

自定义组件,父组件的input事件需要通过$emit参数:

代码语言:javascript
复制
<input type="text" value="value"
@input = "handleinput($event.target.value)">

handleinput: function(){
 // 向父组件触发input事件
 this.$emit('input, value');
}
代码语言:javascript
复制
<div>
自定义组件双向绑定
<my-component v-model="dashucoding">
</my-component>

v-model指令进行双向数据绑定:

代码语言:javascript
复制
<div id="app">
<div>
<h1>v-model工作原理</h1>
<input type="text" v-bind:value="name" v-on:input="name = $event.target.value">
<div>name={{name}}</div>
</div>
<div>
父组件
<my-component v-model="name"></my-component>
</div>
</div>

<template id="my-component">
<div>
组件中
<div>
<input type="text" v-bind:value="value"
v-on:input="handleInput($event.target.value)">
</div>
</div>
</template>
代码语言:javascript
复制
<script>
//创建组件
const MyComponent = {
template: '#my-component",
props: ['value'],
methods: {
 handleInput: function(val){
  this.$emit('input',val);
 }
}
};
// 创建vue实例对象
const app = new Vue({
 el: '#app',
 data: {
  name: ''
 },
 components: {
  MyComponent
 }
});
</script>

动态组件,动态地切换组件的显示内容,多个组件可以使用同一个挂载点。

代码语言:javascript
复制
<div id="app">
<div>
<button @click="currentComponent = 'C1Component'">
c1
</button>
<button @click="currentComponent = 'C2Component'">
c2
</button>

// 使用动态组件
<keey-alive>
<component v-bind:is="currentComponent">
</component>
</keey-alive>

</div>
</div>
代码语言:javascript
复制
<template id="c1">
<div>
this is c1
<div>
 name:<input type="text">
</div>
</div>
</template>
代码语言:javascript
复制
<template id="c2">
<div>
this is c2
</div>
</template>
代码语言:javascript
复制
<script>
// 定义组件
const C1Component = {
 template: '#c1'
};

const C2Component = {
 template: '#c2'
};

// vue实例对象
const app = new Vue({
 el: '#app',
 data: {
  currentComponent: 'C1Component'
 },
 components: {
  C1Component,
  C2Component,
 }
});
</script>

递归组件,需要有一个结束的判断,否则就会一直循环。

代码语言:javascript
复制
<template id="menu-component">
<ul>
<li v-for="item in menus">
{{item.name}}
<menu-component v-if="item.children" :menus="item.children">
</menu-component>
</li>
</ul>
</template>

创建组件:

代码语言:javascript
复制
const MenuComponent = {
 name: 'MenuComponent',
 template: '#menu-component',
 props: ['menus']
}

<div id="app">
<menu-component :menus="menus">
<menu-component>
</div>
代码语言:javascript
复制
<template id="menu-component">
<ul>
<li v-for="item in menus">
{{item.name}}
<menu-component v-if="item.children" :menus="item.children">
</menu-component>
</li>
</ul>
</template>

作者Info:

【作者】:Jeskson 【原创公众号】:达达前端小酒馆。 【转载说明】:转载请说明出处,谢谢合作!~

大前端开发,定位前端开发技术栈博客,PHP后台知识点,web全栈技术领域,数据结构与算法、网络原理等通俗易懂的呈现给小伙伴。谢谢支持,承蒙厚爱!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档