在组件放使用v-model和slot插槽的简单实用
封装的组件(SelectDefault.vue文件):
<template>
<div class="select-default">
<label>{{title}}</label>
<div class="textwarm">
<input type="text"
@click="showPicker"
v-model="inputText"
>
<span class="iconfont"></span>
</div>
<!--v-model属性用来控制是vant–> Popup弹出层是否显示-->
<van-popup v-model="isShow" position="bottom" :overlay="true">
<van-picker
show-toolbar
:title="title"
:columns="columns"
@cancel="onCancel"
@confirm="onConfirm"
/>
</van-popup>
</div>
</template> <script>
import { Picker,Popup } from 'vant';
export default {
name: "SelectDefault",
components: {
[Picker.name]:Picker,
[Popup.name]:Popup
},
data() {
return {
// columns: ['杭州', '宁波', '温州', '嘉兴', '湖州'],
isShow: false,
//设置输入框默认值
inputText: this.dataArr[0].name
}
},
props: {
value: {
type: String, //属性的类型
// required: false, //// true 必须传 false 不是必须传递的
default: '1'// 默认值
},
title: {
type: String
},
//选择器展示的数据
dataArr: {
type: Array,
required: true
}
},
//转换为选择器想要的columns数据格式
computed: {
columns: function () {
let listArr = [];
this.dataArr.forEach((item, index)=>{
// console.log(item, index);
listArr.push(item.name);
});
// console.log(listArr);
return listArr;
}
},
methods: {
//显示选择器
showPicker(){
this.isShow = true;
},
//选择器确定
onConfirm(value, index) {
console.log(`当前值:${value}, 当前索引:${index}`);
//隐藏选择器
this.isShow = false;
//改变输入框的值
this.inputText = value;
//传给使用此组件上的v-model
let userID = this.dataArr[index].user_id.toString();
this.$emit('input', userID);
},
//选择器取消
onCancel() {
console.log('取消');
this.isShow = false;
}
},
created(){
//设置默认值
let userID = this.dataArr[0].user_id.toString();
this.$emit('input', userID);
}
}
</script> <style scoped lang="stylus">
.select-default
display:flex;
justify-content:space-around;
align-items: center;
padding:15px 0;
>.textwarm
position: relative;
span
position: absolute;
top:50%;
right:19px;
font-size:12PX;
color:#d8d8d8;
transform: translateY(-50%);
label
width:150px;
font-size:28px;
color:rgba(26,26,26,1);
line-height:40px;
font-weight:400;
input
width:514px;
padding: 24px 22px;
font-size:30px;
color:rgba(26,26,26,1);
font-weight:400;
border-radius:10px;
border:1PX solid rgba(204,204,204,1);
box-sizing: border-box;
.picker
position fixed
left 0
bottom 0
width 100vw
background-color: red
z-index 222
</style>
在其他.vue文件中使用:
<template>
<div class="add-admin-user">
<p class="p-row1">
<span>用户名</span>
<span>{{userName}}</span>
</p>
<p class="p-row2">
<inputs v-model="name"><label slot="label-name">真实姓名</label></inputs>
</p>
<p class="p-row3">
<span>所属部门:</span>
<span>
<select v-model="department">
<option v-for="item, index in departmentArr" :value ="item.id">{{ item.name }}</option>
</select>
</span>
</p>
<p class="p-row4">
<span>职位:</span>
<span>
<select v-model="role">
<option v-for="item, index in roleArr" :value ="item.id" >{{ item.role_name }}</option>
</select>
</span>
</p>
<p class="p-row5">
<inputs v-model="mobile"><label slot="label-name">联系手机号</label></inputs>
</p>
<p class="p-row6">
<inputs v-model="wechat"><label slot="label-name">微信</label></inputs>
</p>
<p class="p-row7">
<inputs v-model="email"><label slot="label-name">邮箱</label></inputs>
</p> <<--本例演示关键代码-->>
<p class="test">
<SelectDefault v-model="test" title="所属部门" :data-arr="departmentArr"></SelectDefault>
</p> <<--本例演示关键代码END-->> <div class="btn-group">
<span class="cancel-btn" @click="handleCancel">取消</span>
<span class="confirm-btn" @click="handleConfirm">确定</span>
</div> </div>
</template> <script>
import Api from "@/api/modules/adminUser"
import Input from "../components/basic/Input.vue" /*<<--本例演示关键代码-->>*/ import SelectDefault from "../components/basic/SelectDefault" /*<<--本例演示关键代码END-->>*/ export default {
name: "AddAdminUser",
components:{
inputs:Input,
selects:Select,
SelectDefault:SelectDefault ///*<<--本例演示关键代码-->>*/
},
data(){
return{
userName: "",
// /*<<--本例演示关键代码-->>*/
departmentArr: [
{user_id: 1, name: "老板"},
{user_id: 2, name: "秘书"},
{user_id: 3, name: "老板娘"},
{user_id: 4, name: "会计"},
{user_id: 5, name: "模特"}
],
// departmentArr: [], /*<<--本例演示关键代码END-->>*/ roleArr: [],
//以下用户输入信息
name: "",
department: "1",
role: "1" ,
mobile: "",
wechat: "",
email: "",
test: ""
}
},
watch: {
test: function (val, oldVal) {
console.log(val);
}
},
methods: {
//初始化页面数据
initView(){
Api.getUserName().then((res)=>{
// console.log(res);
this.userName = res.data.user_name;
});
Api.departmentListAll().then((res)=>{
// console.log(res);
this.departmentArr = res.data.list;
});
Api.roleListAll().then((res)=>{
// console.log(res);
this.roleArr = res.data;
})
}, //确定
handleConfirm(){
//验证表单
let self = this;
if(!/^1(3|4|5|7|8)\d{9}$/.test(self.mobile)){
console.log('手机号格式不正确');
return;
}
if(!/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(self.email)){
console.log('Email格式不正确');
return;
}
// 发送请求
let param = {
username: this.userName.toString(),
name: this.name,
department_id: this.department,
role_id: this.role,
contact_mobile: this.mobile,
wechat: this.wechat,
email: this.email,
};
console.log(param);
Api.addAdminUser(param).then((res)=>{
console.log(res);
// alert(res.msg);
});
},
// 取消
handleCancel(){
console.log(22);
this.$router.go(-1);
} },
created(){
// this.initView();
} }
</script> <style scoped lang="stylus">
p,div
box-sizing border-box
.add-admin-user
font-family:PingFangSC-Regular;
width 100vw
height 100vh
position relative
font-size 32px
text-align center
p
padding 0 30px
height 90px
.self-input label
text-align left
.p-row1
display flex
span
line-height 90px
span:nth-child(1)
font-size:28px;
font-weight:400;
color:rgba(26,26,26,1);
width 181px
text-align left
text-indent 5px
span:nth-child(2)
font-size:30px;
font-weight:400;
color:rgba(153,153,153,1);
flex 1
text-align left
select
width 300px
.btn-group
position absolute
display flex
left 0
bottom 0
height 80px
width 100%
background-color gray
span
flex 1
</style>
上面实例的效果:

再附上一个solt插槽的简单实用。v-model在组件上使用时,子组件要写的代码。通过@$emit(input,"要传给v-model的值");给组件上的v-model

在组件放使用v-model和slot插槽的简单实用的更多相关文章
- slot插槽(学习笔记)
slot插槽(有默认值,也有名称)一般情况下通过名称进行匹配什么是插槽,有什么用?插槽相当于插入的一个东西,可以用来灵活的封装组件,比如说封装一个模态框对组件进行内容的定制,slot插槽,一对组件标签 ...
- Vue结合slot插槽分发父组件内容实现高度复用、更加灵活的dialog组件
之前写过一篇关于vue实现dialog会话框组件的文章(http://www.cnblogs.com/fozero/p/8546883.html)[http://www.cnblogs.com/foz ...
- 使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件
写在前面 之前写过一篇关于vue实现dialog会话框组件的文章http://www.cnblogs.com/fozero/p/8546883.html, 讲到了如何实现一个vue对话框组件,其中涉及 ...
- 作用域插槽 向父组件传递 <template slot-scope="{ row, index }" slot="dateNo">
作用域插槽 向父组件传递 <template slot-scope="{ row, index }" slot="dateNo"> slotTes ...
- k8s各组件启动时, -v参数指定的日志级别
k8s 相关组件启动时 -v参数指定的日志级别 --v=0 Generally useful for this to ALWAYS be visible to an operator. --v=1 A ...
- vue2.0使用slot插槽分发内容
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Vue slot插槽
插槽用于内容分发,存在于子组件之中. 插槽作用域 父级组件作用域为父级,子级组件作用域为子级,在哪定义的作用域就在哪. 子组件之间的内容是在父级作用域的,无法直接访问子组件里面的数据. 插槽元素 &l ...
- vue slot插槽的使用
slot插槽的使用场景 父组件向子组件传递dom时会用到插槽 作用域插槽:当同一个子组件想要在不同的父组件里展示不同的状态,可以使用作用域插槽.展示的状态由父组件来决定 注:想要修改父组件向子 ...
- Vue slot插槽内容分发
slot插槽使用 使用场景,一般父组件中又一大段模板内容需要运用到子组件上.或者更加复杂的,子组件需要运用到父组件大段模板内容,而子组件却不知道挂载的内容是什么.挂载点的内容是由父组件来决定的. Sl ...
随机推荐
- 【mmall】Jackson相关知识点
Jackson fasterxml和codehaus的区别 (fasterxml vs. codehaus) http://blog.csdn.net/clementad/article/detail ...
- java实现在线浏览PDF文档功能
实现在线浏览pdf文档功能(本代码适用于项目服务中固定的并且少量的pdf浏览,比如注册时的注册条款在线浏览等): //设置响应内容类型为PDF类型 response.setContentType(&q ...
- 2017-2018-2 20165237 实验四《Android开发基础》实验报告
2017-2018-2 20165237 实验四<Android开发基础>实验报告 实验报告表头: No.1 实验要求: Android程序设计-1 实验要求: 参考<Java和An ...
- iframe教程
有关iframe的最强大的强大的教程 $(window.parent.document).contents().find("#tab_release"+taskId2+" ...
- 【转】Win10下python3和python2多版本同时安装并解决pip共存问题
[转]Win10下python3和python2多版本同时安装并解决pip共存问题 特别说明,本文是在Windows64位系统下进行的,32位系统请下载相应版本的安装包,安装方法类似. 使用pytho ...
- MySQL全备+binlog恢复方法之伪装master【原创】
利用mysql全备 +binlog server恢复方法之伪装master 单实例试验 一.试验环境 10.72.7.40 实例 mysql3306为要恢复的对象,mysql3306的全备+binlo ...
- 用ARX自定义实体
本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h",&quo ...
- 第八章 让Bootstrap轮播插件carousel支持左右滑动手势的三种方法
因为最近开发的项目涉及到移动设备上的 HTML5 开发,其中需要实现轮播效果.然后最快捷的方式,你知道的(Bootstrap),然后原生的 Bootstrap 的 carousel.js 插件并没有支 ...
- <TCP/IP>Internet地址结构回顾
本章介绍了Internet中使用的网络层地址,又称IP地址. 要想在网上冲浪,一个设备至少要有一个IP地址(PS:我用赛风FQ的时候,居然自动更换了IP地址,顿时感觉很神奇但是不知道为什么) ***成 ...
- gcc的使用简介与命令行参数说明
(一) gcc的基本用法(二) 警告提示功能选项(三) 库操作选项(四) 调试选项(五) 交叉编译选项 (一) gcc的基本用法使用gcc编译器时,必须给出一系列必要的调用参数和文件名称.不同参数的先 ...