实现原理

主要参考vue官网上的自定义事件,父组件v-bind给子组件传参数,子组件利用props来接受父组件那边传过来的参数。我们还会遇到一个问题,怎么实时拿到props的值给data里面的值呢?其实很简单,利用watch属性监听props某个值的变化,把新的值给data

拿值拿到了,就根据业或UI的需求实现页面...

代码写啊写,逻辑走啊走,得到我们最终要的那个值后,怎么把它从子组件里面传出来给父组件呢?其实我们可以利用.sync修饰符对prop进行”双向数据绑定”:子组件emit发射事件,父组件监听这个事件然后更新一个本地数据。

我们推荐以 update:myPropName 的模式触发事件取而代之。举个例子,在一个包含 title prop 的假设的组件中,我们可以用以下方法表达对其赋新值的意图:

this.$emit('update:title', newTitle)
-------------子组件在上面,父组件代码在下,可以参考vue官网------------------------------
<text-document
v-bind:title="doc.title"
v-on:update:title="doc.title = $event"
></text-document>

性别选择器

实现代码


<!--author: StephenWu5 慎用!!!!!性别选择器-->
<template>
<div class="SexSelector">
<div class="male" :class="[this.innerSex == 1? 'active': '']" @click="select1">男</div>
<div class="female" :class="[this.innerSex == 2? 'active': '']" @click="select2">女</div>
</div>
</template> <script>
export default{
name: 'SexSelector',
props: {
sex: [String, Number],
//sex: {
//type: Number,
//default: 0
//}
},
watch:{
sex: function(newQuestion){ //利用监听属性给data里面innerSex赋值吧。
this.innerSex = newQuestion;
}
},
data: function(){
return{
innerSex: '',
//这里其实可以优化一下
enumsSelect: [{
code: 1,
text: '男'
},{
code: 2,
text: '女'
}], // 下拉选
}
},
methods:{
select1(){
let male = 1;
this.innerSex = male;
console.log(this.innerSex)
this.$emit('update:sex', male);
},
select2(){
let female = 2;
this.innerSex = female;
console.log(this.innerSex)
this.$emit('update:sex', female);
}
},
created(){
}
}
</script> <style scoped lang='less'>
.SexSelector{
div{
display: inline-block;
width: 70px;
height: 30px;
border: 1px solid #ccc;
line-height: 30px;
text-align: center;
cursor: pointer;
border-radius: 3px; &.active{
color: #B1CDFF ;
border-color: #B1CDFF;
}
} }
</style>
使用方法:
<sex-select  :sex.sync="obj.sex"></sex-select>

效果如下

仿百度搜索栏

实现代码


<!--author: StephenWu5 慎用!!!!!-->
<template>
<div id="watch-example" class="select2Wrapper" >
<p class='wrapper-item'>
<input v-model="someName" class="form-control" @focus="showList(true)">
</p>
<ul v-show="usersList.length != 0 && showListOrNot" class='wrapper-item'>
<li v-for="(item,index) in usersList" :key="index" @click="selectThisOne($event,item)">{{item.name}}</li>
</ul>
</div> </template> <script>
import _ from 'lodash'; export default{
name: 'Select2',
props: {
userName: {
type: String,
default: '',
}
},
data(){
return{
//userName: '',
showListOrNot: false,
someName: this.userName,
usersList: [],
usersListReturn: [ //模拟后台返回的列表数据
{
name: '周星驰',
value: 0,
},
{
name: '周星驰21',
value: 0,
},
{
name: '周星驰',
value: 0,
},
{
name: '周星驰',
value: 0,
},
{
name: '周星驰',
value: 0,
},
{
name: '周星驰',
value: 0,
},
{
name: '周星驰',
value: 0,
},
]
}
},
watch: {
// 如果 `userName` 发生改变,这个函数就会运行 这里主要是运用了vue官网上的侦听器。
someName: function (newuserName, oldQuestion) {
this.debouncedGetusers()
},
userName: function(newVal, oldVal){
this.someName = newVal;
}
},
created: function () {
// `_.debounce` 是一个通过 Lodash 限制操作频率的函数。
this.debouncedGetusers = _.debounce(this.getusers, 500)
},
methods: {
getusers: function () {
if (this.someName === '') {
this.usersList = [];
return
}
var vm = this;
this.usersList = this.usersListReturn;
//这里写ajax请求
},
selectThisOne(event,item){ //如何返回给父组件?
event.preventDefault();
this.showListOrNot = false;
this.someName = item.name;
this.$emit('update:userName', item.name);
},
showList(value){
this.showListOrNot = value;
}
}
}
</script> <style scoped lang='less'>
.select2Wrapper{
z-index: 999; position: relative;
p.wrapper-item{ input{
width: 100%;
}
}
ul.wrapper-item{
position: absolute;
z-index: 999;
width: 100%;
background-color: #9DC1FF;
background-color: white;
border: 1px solid #ccc;
li{
z-index: 999;
padding: 0 10px;
&:hover{
background-color: #ccc;
}
}
}
} </style>

使用方法

<select2  :userName.sync="obj.number" ></select2>

效果图

注意项

修饰符asyc是支持对象,数组等的哈哈。

支持缩写成这个样子,连props的那个都不用写哈,一直错了好久哈。

<text-document v-bind:title.sync="doc.title"></text-document>

最后,欢迎关注我的公众号。

vue--组件性别选择器和仿百度搜索栏的更多相关文章

  1. js仿百度文库文档上传页面的分类选择器_第二版

    仿百度文库文档上传页面的多级联动分类选择器第二版,支持在一个页面同一时候使用多个分类选择器. 此版本号把HTML,CSS,以及图片都封装到"category.js"中.解决因文件路 ...

  2. vue-resource使用 (vue仿百度搜索)

    1.this.$http.get()方法2.this.$http.post()方法3.this.$http.jsonp()方法 (vue仿百度搜索) 在输入框中输入a, 然后在百度f12 ==> ...

  3. 009——VUE中watch监听属性变化实现类百度搜索栏功能

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. Springboot+Vue实现仿百度搜索自动提示框匹配查询功能

    案例功能效果图 前端初始页面 输入搜索信息页面 点击查询结果页面 环境介绍 前端:vue 后端:springboot jdk:1.8及以上 数据库:mysql 核心代码介绍 TypeCtrler .j ...

  5. 仿ElementUI构建自己的Vue组件库用babel-plugin-component按需加载组件及自定义SASS主题

    最近使用ElementUI做项目的时候用Babel的插件babel-plugin-component做按需加载,使得组件打包的JS和CSS包体积大大缩小,加载速度也大大提升,所有想模仿做一个组件库也来 ...

  6. VUE组件汇总

    内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 UI组件 element ★13489 - 饿了么出品的Vue2的web UI工具套件 Vux ★8133 - 基于Vue和 ...

  7. Vue基础语法(样式绑定,事件处理,表单,Vue组件)

    样式绑定 事件处理 表单 Vue组件 样式绑定 <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...

  8. 基于vue的颜色选择器color-picker

    项目中有用到颜色选择器的童鞋们可以看过来了 关于color-picker的jquery的插件是有蛮多,不过vue组件没有吧,反正我没有找到, 虽然element-ui里面有这个,但是你愿意为了一个小功 ...

  9. 如何在vue单页应用中使用百度地图

    作为一名开发人员,每次接到开发任务,我们首先应该先分析需求,然后再思考技术方案和解决方案.三思而后行,这是一个好的习惯. 需求:本项目是采用vue组件化开发的单页应用项目,现需要在项目中引入百度的地图 ...

随机推荐

  1. vs调试cordova app时 scriptedsandbox64.exe已停止工作的错误处理方法

    1.把ie更新到版本11 2.去掉 选项->调试->调试时启动诊断工具 有时候调试会启动失败,提示版本过低,再一次点击调试就可以了.

  2. mysql 更改root密码

    mysql 更改root密码,有很多种,网上也有很多记录,这里只是做个记录,以后可以看看,只记录两种自己常用的方法. 1.改表法,登录到数据库,切换到:mysql数据库,update user set ...

  3. UWP开发:获取用户当前所在的网络环境(WiFi、移动网络、LAN…)

    原文:UWP开发:获取用户当前所在的网络环境(WiFi.移动网络.LAN-) UWP开发:获取用户当前所在的网络环境: 在uwp开发中,有时候,我们需要判断用户所在的网络,是WiFi,还是移动网络,给 ...

  4. VC 使用msxml6.dll动态链接库中的函数读写XML文件

    VC 使用msxml6.dll动态链接库中的函数读写XML文件 目录 1 引言 2 .dll使用方法 3 常用函数总结 4 实例应用 5 运行效果预览 6 补充说明 7 不足之处 8 更新   引言: ...

  5. Qt5---ftp上传功能(可直接克隆某个小模块,查看QT下FTP的socket原理)

    http://blog.csdn.net/freeape/article/details/52802163

  6. MeeGo 设备运行全部 Android 应用程序?

    啥是 OpenMobile ACL?它是一个应用程序兼容层(Application Compatibility Layer),能让 MeeGo 设备运行全部 Android 应用程序. 据 ACL 宣 ...

  7. Realm_King 之 XPDL(XML Process Definition Language)

    XPDL(XML Process Definition Language)是由Workflow Management Coalition(简写为:WfMC)所提出的一个标准化规格,使用XML文件让不同 ...

  8. mysql查询类型转换问题

    mysql转换类型.类型转换.查询结果类型转换 一.问题来源 数据库一张表的主键id设为了自增,那就是int型的,但是其他表的关联字段又设置成了字符串! 而且已经开发了很久才发现问题,既然出现了问题肯 ...

  9. SpringBoot实现文件上传

    前言参考:快速开发第一个SpringBoot应用 这篇文章会讲解如何使用SpringBoot完成一个文件上传的过程,并且附带一些SpringBoot开发中需要注意的地方 首先我们写一个文件上传的htm ...

  10. Java入门网络编程-使用UDP通信

    程序说明: 以下代码,利用java的网络编程,使用UDP通信作为通信协议,描述了一个简易的多人聊天程序,此程序可以使用公网或者是局域网进行聊天,要求有一台服务器.程序一共分为2个包,第一个包:udp, ...