封装的组件(SelectDefault.vue文件):

  1. <template>
  2. <div class="select-default">
  3. <label>{{title}}</label>
  4. <div class="textwarm">
  5. <input type="text"
  6. @click="showPicker"
  7. v-model="inputText"
  8. >
  9. <span class="iconfont"></span>
  10. </div>
  11. <!--v-model属性用来控制是vant&ndash;&gt; Popup弹出层是否显示-->
  12. <van-popup v-model="isShow" position="bottom" :overlay="true">
  13. <van-picker
  14. show-toolbar
  15. :title="title"
  16. :columns="columns"
  17. @cancel="onCancel"
  18. @confirm="onConfirm"
  19. />
  20. </van-popup>
  21. </div>
  22. </template>
  23.  
  24. <script>
  25. import { Picker,Popup } from 'vant';
  26. export default {
  27. name: "SelectDefault",
  28. components: {
  29. [Picker.name]:Picker,
  30. [Popup.name]:Popup
  31. },
  32. data() {
  33. return {
  34. // columns: ['杭州', '宁波', '温州', '嘉兴', '湖州'],
  35. isShow: false,
  36. //设置输入框默认值
  37. inputText: this.dataArr[0].name
  38. }
  39. },
  40. props: {
  41. value: {
  42. type: String, //属性的类型
  43. // required: false, //// true 必须传 false 不是必须传递的
  44. default: '1'// 默认值
  45. },
  46. title: {
  47. type: String
  48. },
  49. //选择器展示的数据
  50. dataArr: {
  51. type: Array,
  52. required: true
  53. }
  54. },
  55. //转换为选择器想要的columns数据格式
  56. computed: {
  57. columns: function () {
  58. let listArr = [];
  59. this.dataArr.forEach((item, index)=>{
  60. // console.log(item, index);
  61. listArr.push(item.name);
  62. });
  63. // console.log(listArr);
  64. return listArr;
  65. }
  66. },
  67. methods: {
  68. //显示选择器
  69. showPicker(){
  70. this.isShow = true;
  71. },
  72. //选择器确定
  73. onConfirm(value, index) {
  74. console.log(`当前值:${value}, 当前索引:${index}`);
  75. //隐藏选择器
  76. this.isShow = false;
  77. //改变输入框的值
  78. this.inputText = value;
  79. //传给使用此组件上的v-model
  80. let userID = this.dataArr[index].user_id.toString();
  81. this.$emit('input', userID);
  82. },
  83. //选择器取消
  84. onCancel() {
  85. console.log('取消');
  86. this.isShow = false;
  87. }
  88. },
  89. created(){
  90. //设置默认值
  91. let userID = this.dataArr[0].user_id.toString();
  92. this.$emit('input', userID);
  93. }
  94. }
  95. </script>
  96.  
  97. <style scoped lang="stylus">
  98. .select-default
  99. display:flex;
  100. justify-content:space-around;
  101. align-items: center;
  102. padding:15px 0;
  103. >.textwarm
  104. position: relative;
  105. span
  106. position: absolute;
  107. top:50%;
  108. right:19px;
  109. font-size:12PX;
  110. color:#d8d8d8;
  111. transform: translateY(-50%);
  112. label
  113. width:150px;
  114. font-size:28px;
  115. color:rgba(26,26,26,1);
  116. line-height:40px;
  117. font-weight:400;
  118. input
  119. width:514px;
  120. padding: 24px 22px;
  121. font-size:30px;
  122. color:rgba(26,26,26,1);
  123. font-weight:400;
  124. border-radius:10px;
  125. border:1PX solid rgba(204,204,204,1);
  126. box-sizing: border-box;
  127. .picker
  128. position fixed
  129. left 0
  130. bottom 0
  131. width 100vw
  132. background-color: red
  133. z-index 222
  134. </style>

在其他.vue文件中使用:

  1. <template>
  2. <div class="add-admin-user">
  3. <p class="p-row1">
  4. <span>用户名</span>
  5. <span>{{userName}}</span>
  6. </p>
  7. <p class="p-row2">
  8. <inputs v-model="name"><label slot="label-name">真实姓名</label></inputs>
  9. </p>
  10. <p class="p-row3">
  11. <span>所属部门:</span>
  12. <span>
  13. <select v-model="department">
  14. <option v-for="item, index in departmentArr" :value ="item.id">{{ item.name }}</option>
  15. </select>
  16. </span>
  17. </p>
  18. <p class="p-row4">
  19. <span>职位:</span>
  20. <span>
  21. <select v-model="role">
  22. <option v-for="item, index in roleArr" :value ="item.id" >{{ item.role_name }}</option>
  23. </select>
  24. </span>
  25. </p>
  26. <p class="p-row5">
  27. <inputs v-model="mobile"><label slot="label-name">联系手机号</label></inputs>
  28. </p>
  29. <p class="p-row6">
  30. <inputs v-model="wechat"><label slot="label-name">微信</label></inputs>
  31. </p>
  32. <p class="p-row7">
  33. <inputs v-model="email"><label slot="label-name">邮箱</label></inputs>
  34. </p>
  35.  
  36. <<--本例演示关键代码-->>
  37. <p class="test">
  38. <SelectDefault v-model="test" title="所属部门" :data-arr="departmentArr"></SelectDefault>
  39. </p>
  40.  
  41. <<--本例演示关键代码END-->>
  42.  
  43. <div class="btn-group">
  44. <span class="cancel-btn" @click="handleCancel">取消</span>
  45. <span class="confirm-btn" @click="handleConfirm">确定</span>
  46. </div>
  47.  
  48. </div>
  49. </template>
  50.  
  51. <script>
  52. import Api from "@/api/modules/adminUser"
  53. import Input from "../components/basic/Input.vue"
  54.  
  55. /*<<--本例演示关键代码-->>*/
  56.  
  57. import SelectDefault from "../components/basic/SelectDefault"
  58.  
  59. /*<<--本例演示关键代码END-->>*/
  60.  
  61. export default {
  62. name: "AddAdminUser",
  63. components:{
  64. inputs:Input,
  65. selects:Select,
  66. SelectDefault:SelectDefault ///*<<--本例演示关键代码-->>*/
  67. },
  68. data(){
  69. return{
  70. userName: "",
  71. // /*<<--本例演示关键代码-->>*/
  72. departmentArr: [
  73. {user_id: 1, name: "老板"},
  74. {user_id: 2, name: "秘书"},
  75. {user_id: 3, name: "老板娘"},
  76. {user_id: 4, name: "会计"},
  77. {user_id: 5, name: "模特"}
  78. ],
  79. // departmentArr: [],
  80.  
  81. /*<<--本例演示关键代码END-->>*/
  82.  
  83. roleArr: [],
  84. //以下用户输入信息
  85. name: "",
  86. department: "1",
  87. role: "1" ,
  88. mobile: "",
  89. wechat: "",
  90. email: "",
  91. test: ""
  92. }
  93. },
  94. watch: {
  95. test: function (val, oldVal) {
  96. console.log(val);
  97. }
  98. },
  99. methods: {
  100. //初始化页面数据
  101. initView(){
  102. Api.getUserName().then((res)=>{
  103. // console.log(res);
  104. this.userName = res.data.user_name;
  105. });
  106. Api.departmentListAll().then((res)=>{
  107. // console.log(res);
  108. this.departmentArr = res.data.list;
  109. });
  110. Api.roleListAll().then((res)=>{
  111. // console.log(res);
  112. this.roleArr = res.data;
  113. })
  114. },
  115.  
  116. //确定
  117. handleConfirm(){
  118. //验证表单
  119. let self = this;
  120. if(!/^1(3|4|5|7|8)\d{9}$/.test(self.mobile)){
  121. console.log('手机号格式不正确');
  122. return;
  123. }
  124. if(!/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(self.email)){
  125. console.log('Email格式不正确');
  126. return;
  127. }
  128. // 发送请求
  129. let param = {
  130. username: this.userName.toString(),
  131. name: this.name,
  132. department_id: this.department,
  133. role_id: this.role,
  134. contact_mobile: this.mobile,
  135. wechat: this.wechat,
  136. email: this.email,
  137. };
  138. console.log(param);
  139. Api.addAdminUser(param).then((res)=>{
  140. console.log(res);
  141. // alert(res.msg);
  142. });
  143. },
  144. // 取消
  145. handleCancel(){
  146. console.log(22);
  147. this.$router.go(-1);
  148. }
  149.  
  150. },
  151. created(){
  152. // this.initView();
  153. }
  154.  
  155. }
  156. </script>
  157.  
  158. <style scoped lang="stylus">
  159. p,div
  160. box-sizing border-box
  161. .add-admin-user
  162. font-family:PingFangSC-Regular;
  163. width 100vw
  164. height 100vh
  165. position relative
  166. font-size 32px
  167. text-align center
  168. p
  169. padding 0 30px
  170. height 90px
  171. .self-input label
  172. text-align left
  173. .p-row1
  174. display flex
  175. span
  176. line-height 90px
  177. span:nth-child(1)
  178. font-size:28px;
  179. font-weight:400;
  180. color:rgba(26,26,26,1);
  181. width 181px
  182. text-align left
  183. text-indent 5px
  184. span:nth-child(2)
  185. font-size:30px;
  186. font-weight:400;
  187. color:rgba(153,153,153,1);
  188. flex 1
  189. text-align left
  190. select
  191. width 300px
  192. .btn-group
  193. position absolute
  194. display flex
  195. left 0
  196. bottom 0
  197. height 80px
  198. width 100%
  199. background-color gray
  200. span
  201. flex 1
  202. </style>

上面实例的效果:

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

在组件放使用v-model和slot插槽的简单实用的更多相关文章

  1. slot插槽(学习笔记)

    slot插槽(有默认值,也有名称)一般情况下通过名称进行匹配什么是插槽,有什么用?插槽相当于插入的一个东西,可以用来灵活的封装组件,比如说封装一个模态框对组件进行内容的定制,slot插槽,一对组件标签 ...

  2. Vue结合slot插槽分发父组件内容实现高度复用、更加灵活的dialog组件

    之前写过一篇关于vue实现dialog会话框组件的文章(http://www.cnblogs.com/fozero/p/8546883.html)[http://www.cnblogs.com/foz ...

  3. 使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件

    写在前面 之前写过一篇关于vue实现dialog会话框组件的文章http://www.cnblogs.com/fozero/p/8546883.html, 讲到了如何实现一个vue对话框组件,其中涉及 ...

  4. 作用域插槽 向父组件传递 <template slot-scope="{ row, index }" slot="dateNo">

    作用域插槽 向父组件传递 <template slot-scope="{ row, index }"  slot="dateNo"> slotTes ...

  5. k8s各组件启动时, -v参数指定的日志级别

    k8s 相关组件启动时 -v参数指定的日志级别 --v=0 Generally useful for this to ALWAYS be visible to an operator. --v=1 A ...

  6. vue2.0使用slot插槽分发内容

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

  7. Vue slot插槽

    插槽用于内容分发,存在于子组件之中. 插槽作用域 父级组件作用域为父级,子级组件作用域为子级,在哪定义的作用域就在哪. 子组件之间的内容是在父级作用域的,无法直接访问子组件里面的数据. 插槽元素 &l ...

  8. vue slot插槽的使用

    slot插槽的使用场景 父组件向子组件传递dom时会用到插槽   作用域插槽:当同一个子组件想要在不同的父组件里展示不同的状态,可以使用作用域插槽.展示的状态由父组件来决定   注:想要修改父组件向子 ...

  9. Vue slot插槽内容分发

    slot插槽使用 使用场景,一般父组件中又一大段模板内容需要运用到子组件上.或者更加复杂的,子组件需要运用到父组件大段模板内容,而子组件却不知道挂载的内容是什么.挂载点的内容是由父组件来决定的. Sl ...

随机推荐

  1. tidb调研

    TiDB是新一代开源分布式 NewSQL 数据库,相比较于我们常见的数据库MySQL,TiDB具有水平伸缩.强一致性的分布式事务.基于 Raft 算法的多副本复制等特性.同时,TiDB兼容MySQL生 ...

  2. java基础梳理--朝花夕拾(一)

    简介: Java是一种撰写跨平台应用软件的面向对象语言,1995年由Sun Microsystems公司推出. 2009年04月20日,甲骨文74亿美元收购Sun,取得java的版权. 2011年7月 ...

  3. /bin/bash^M: bad interpreter: No such file or directory 解决办法

    参考:-bash: ./my_script: /bin/bash^M: bad interpreter: No such file or directory [duplicate] 有的时候运行.sh ...

  4. NOIP2018D1T1 铺设道路

    原题:NOIP2013D1T1 积木大赛 题目地址:P5019 铺设道路 思路:玄学瞎搞 将每块区域插入一个小根堆,这里的小根堆用优先队列实现,即运用一个 \(pair\) , \(first\) 为 ...

  5. C#如何操作XML文件

    ⒈XML? XML是一种可扩展的标记语言 具有以下特点 1.严格区分大小写 2.标签成对出现 3.有且只有一个根节点 ⒉XML的创建 <?xml version="1.0" ...

  6. Thymeleaf相关补充

    ⒈理解Thymeleaf Java模板引擎.能够处理HTML.XML.JavaScript.CSS甚至纯文本.类似JSP.Freemarker 自然模板.原型即页面 语法优雅易懂,OGNL.Sprin ...

  7. CGI,FastCGI,PHP-CGI与PHP-FPM区别详解【转】

    CGI CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上. CGI可以用任何一 ...

  8. Tomcat 部署及配置

    下载,解压tomcat.jdk 1.解压,链接tomcat.jdk tar xf jdk-8u161-linux-x64.tar.gz .tar.gz .0_161/ /usr/local/ .0_1 ...

  9. 华为QUIDWAY系列路由器的负载均衡配置

    作者:邓聪聪 华为系列路由器的负载均衡NQA联动侦测配置案例: 需求:该局域网,IP地址(末位奇数)走联通,IP地址(末位偶数)走电信当某个运营商不可达时,自动切换.通过NQA来确定运营商是否可达., ...

  10. This project is not a myeclipse hibernate project . Assuming Hibernate 3 capabilities configuration editor

    开某工程Hibernate配置文件时出现提示,信息大概如标题. 根据网友提供,选中工程,点击MyEclipse-->Project capabilities-->add hibernate ...