一、最近在工作过程中要实现一个搜索模糊匹配功能,考虑到组件的复用,就单独把搜索框抽出来作为一个子组件。在以往的开发中,我一般会在input框中的值变化时向父组件emit一个事件,并带上一些父组件中需要的参数(比如搜索的关键词,或者搜索之后返回的结果)

大概的实现方式如下:

父组件
<template>
<div>
<search @test="getData"></search>
<button @click="submit">提交</button>
</div>
</template>
<script>
import search from '@/components/index/search.vue'
export default {
data() {
return {
keywords: ''
}
},
components: {
search
},
methods: {
getData(val){
this.keywords = val
},
submit() {
console.log('keywords:', this.keywords)
}
}
}
</script> 子组件
<template>
<div>
<input @input="inputChange" type="text" name="keywords">
</div>
</template>
<script>
export default {
props: ['keywords'],
methods: {
inputChange(e) {
this.$emit('test', e.target.value)
}
}
}
</script>

二、这次在实现的时候,我隐约记得在之前看Vue api的时候提到过,给组件添加v-model,就想用这种方式尝试一下,根据官网解释我理解:

v-model这个双向绑定相当于做了两个操作:(1)给当前这个组件添加了一个value属性 (2)给当前这个组件绑定了一个input事件;由此我修改实现方式如下:

父组件:

<template>
<div>
<search v-model="keywords"></search>
<button @click="submit">提交</button>
</div>
</template>
<script>
import search from '@/components/index/search.vue'
export default {
data() {
return {
keywords: ''
}
},
components: {
search
},
methods: {
submit() {
console.log('keywords:', this.keywords)
}
}
}
</script>

子组件:

<template>
<div>
<input :value="value" @input="$emit('input', $event.target.value)" type="text" name="keywords">
</div>
</template>
<script>
export default {
props: ['value']
}
</script>

三、总结:其实两种思路是一样的,都是子组件通过emit事件向父组件传值,但是v-model的形式更直观简单~

Vue——组件上使用v-model的更多相关文章

  1. vue组件上动态添加和删除属性

    1.vue组件上动态添加和删除属性 // 添加 this.$set(this.obj, 'propName', val) // 删除 this.$delete(this.obj, 'propName' ...

  2. vue 学习六 在组件上使用v-model

    其实这个部分应该是属于component,为什么把这玩意单独拿出来呢,原因是它这个东西比较涉及到了vue的事件,以及v-model指令的使用,还是比较综合的.所以就拿出来啦 父组件 <templ ...

  3. webAPP如何实现移动端拍照上传(Vue组件示例)?

    摘要:使用HTML5编写移动Web应用,主要是为了尝试一下“一套代码多处运行”,一个webapp几乎可以不加修改的运行在PC/Android/iOS等上面运行.但是写到现在觉得虽然这种方式弊大于利,不 ...

  4. vue里在自定义的组件上定义的事件

    事件分为原生事件和自定义事件. vue里在自定义的组件上定义的事件,都被认为是自定义事件,必须用$emit()来触发. 这也是子组件向父传值的原理. 如果想作为原生事件,需要在原生事件后面加上.nat ...

  5. vue图片上传组件

    前言:很多项目中都需要用到图片上传功能,而其多处使用的要求,为了避免重复造轮子,让我决定花费一些时间去深入了解,最终封装了一个vue的图片上传组件.现将总结再次,希望有帮助. Layout <d ...

  6. vue 学习七 组件上使用插槽

    我们有时候可能会在组件上添加元素,就像下面那样 <template> <div id="a"> <com1> <p>我是渲染的值&l ...

  7. c#版阿里云oss上传——基于layui、pupload的oss 后端web端直传的vue组件

    废话前言 去年,做项目用到oss上传,度娘上逛了一圈写了个前后端代码结合的c#版oss上传. 今年又要用到oss上传时发现很难复用,复用改动的范围太大,显然这个轮子不合格.于是想了下,花了一天的时间( ...

  8. AntDesign VUE:上传组件图片/视频宽高、文件大小、image/video/pdf文件类型等限制(Promise、Boolean)

    文件大小限制 - Promise checkFileSize(file, rules) { return new Promise((resolve, reject) => { file.size ...

  9. AntDesign VUE:上传组件自定义限制的两种方式(Boolean、Promise)

    AntD上传组件 AntDesign VUE文档 第一种方式 beforeUpload(file) { let isLt = true if (filesSize) { isLt = file.siz ...

随机推荐

  1. 使用redis实现客户端和服务端token验证

    实在是思维江化啊,没有想到可以给redis设置不同的key值来实现不同key值存储不同的value值,而一直想着给一个名为token的key值新增不同的数据,并设置过期时间,然而这样却不能新增只能做到 ...

  2. Spring Boot主要目标

    Spring Boot主要目标 Spring Boot的主要目标是: 为所有Spring开发提供一个基本的,更快,更广泛的入门体验. 开箱即用,但随着需求开始偏离默认值,快速启动. 提供大型项目(例如 ...

  3. 从零开始学Jqueue

    http://www.cnblogs.com/zhangziqiu/archive/2009/04/30/jQuery-Learn-1.html

  4. android webview 输入法键盘遮挡输入框的问题

    新建一个工具类: /** * 解决webView键盘遮挡问题的类 * Created by zqy on 2016/11/14. */ public class KeyBoardListener { ...

  5. TRUNCATE - 清空一个表

    SYNOPSIS TRUNCATE [ TABLE ] name DESCRIPTION 描述 TRUNCATE 快速地从一个表中删除所有行.它和无条件的 DELETE 有同样的效果,不过因为它不做表 ...

  6. Java微服务(Spring-boot+MyBatis+Maven)入门教程

    1,项目创建    新建maven项目,如下图: 选择路径,下一步 输入1和2的内容,点完成 项目创建完毕,结构如下图所示: 填写pom.xml里内容,为了用于打包,3必须选择jar,4和5按图上填写 ...

  7. java 面试2019

    [第一部分] 面试要领[第1题] 流程必知必会[第2题] JDK源码[第二部分] 类和对象[第二篇] 面向对象基础[第1题] 面向对象是什么?[第2题] 类加载的过程[第3题] 类加载器有哪些[第4题 ...

  8. HashMap和Hashtable有什么区别

    HashMap和Hashtable都实现了Map接口,因此很多特性非常相似.但是,他们有以下不同点: HashMap允许键和值是null,而Hashtable不允许键或者值是null. Hashtab ...

  9. 8.Struts2拦截器

    1. 拦截器的概述 * 拦截器就是AOP(Aspect-Oriented Programming)的一种实现.(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.) * ...

  10. 修改ie版本为Edge

    <meta http-equiv="X-UA-Compatible" content="IE=Edge"> #以上代码告诉IE浏览器,IE8/9及以 ...