一、过滤器

1-1 私有过滤器

  1. <script>
  2. // 创建 Vue 实例,得到 ViewModel
  3. var vm = new Vue({
  4. el: '#app',
  5. data: {
  6. msg: '曾经,我也是一个单纯的少年,单纯的我,傻傻的问,谁是世界上最单纯的男人'
  7. },
  8. methods: {},
  9. filters: {
  10. // 过滤器的三个参数:1.要过滤的文本 2.过滤的内容 3.替换的内容
  11. // 过滤器调用的时候,采用的是就近原则,如果私有过滤器和全局过滤器名称一致了,这时候优先调用私有过滤器
  12. msgFormat: function (msg, arg, arg2) {
  13. // 字符串的 replace 方法,第一个参数,除了可写一个 字符串之外,还可以定义一个正则
  14. return msg.replace(/少年/g, arg + arg2)
  15. }
  16. },
  17. });
  18. </script>

使用:

  1. <p>{{ msg | msgFormat('疯狂+1', '123') | test }}</p>

1-2 全局过滤器

  1. // 定义一个 Vue 全局的过滤器,名字叫做 msgFormat
  2. Vue.filter('msgFormat', function (msg, arg, arg2) {
  3. // 字符串的 replace 方法,第一个参数,除了可写一个 字符串之外,还可以定义一个正则
  4. return msg.replace(/单纯/g, arg + arg2)
  5. })

示例:

  1. //main.js
  2. Vue.filter("format",function(val){
  3. if(val.length>6){
  4. val = val.slice(0,6)+"..."
  5. }
  6. return val
  7. })
  1. <div id="app">
  2. {{msg|format(2)}}
  3. </div>
  4. <script>
  5. var vm=new Vue({
  6. el:"#app",
  7. data:{
  8. msg:99.5484951
  9. },
  10. filters:{
  11. // val就是msg params就是管道修饰符后面函数传递过来的参数。
  12. format(val,params){
  13. return "¥"+val.toFixed(params);
  14. }
  15. }
  16. })

1-3 常用的过滤器

  1. //1.去除空格 type 1-所有空格 2-前后空格 3-前空格 4-后空格
  2. function trim(value, trim) {
  3. switch (trim) {
  4. case 1:
  5. return value.replace(/\s+/g, "");
  6. case 2:
  7. return value.replace(/(^\s*)|(\s*$)/g, "");
  8. case 3:
  9. return value.replace(/(^\s*)/g, "");
  10. case 4:
  11. return value.replace(/(\s*$)/g, "");
  12. default:
  13. return value;
  14. }
  15. }
  16. //2.任意格式日期处理
  17. //使用格式:
  18. // {{ '2018-09-14 01:05' | formaDate(yyyy-MM-dd hh:mm:ss) }}
  19. // {{ '2018-09-14 01:05' | formaDate(yyyy-MM-dd) }}
  20. // {{ '2018-09-14 01:05' | formaDate(MM/dd) }} 等
  21. function formaDate(value, fmt) {
  22. var date = new Date(value);
  23. var o = {
  24. "M+": date.getMonth() + 1, //月份
  25. "d+": date.getDate(), //日
  26. "h+": date.getHours(), //小时
  27. "m+": date.getMinutes(), //分
  28. "s+": date.getSeconds(), //秒
  29. "w+": date.getDay(), //星期
  30. "q+": Math.floor((date.getMonth() + 3) / 3), //季度
  31. "S": date.getMilliseconds() //毫秒
  32. };
  33. if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
  34. for (var k in o) {
  35. if(k === 'w+') {
  36. if(o[k] === 0) {
  37. fmt = fmt.replace('w', '周日');
  38. }else if(o[k] === 1) {
  39. fmt = fmt.replace('w', '周一');
  40. }else if(o[k] === 2) {
  41. fmt = fmt.replace('w', '周二');
  42. }else if(o[k] === 3) {
  43. fmt = fmt.replace('w', '周三');
  44. }else if(o[k] === 4) {
  45. fmt = fmt.replace('w', '周四');
  46. }else if(o[k] === 5) {
  47. fmt = fmt.replace('w', '周五');
  48. }else if(o[k] === 6) {
  49. fmt = fmt.replace('w', '周六');
  50. }
  51. }else if (new RegExp("(" + k + ")").test(fmt)) {
  52. fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  53. }
  54. }
  55. return fmt;
  56. }
  57. //3.字母大小写切换
  58. /*type
  59. 1:首字母大写
  60. 2:首页母小写
  61. 3:大小写转换
  62. 4:全部大写
  63. 5:全部小写
  64. * */
  65. function changeCase(str, type) {
  66. function ToggleCase(str) {
  67. var itemText = ""
  68. str.split("").forEach(
  69. function (item) {
  70. if (/^([a-z]+)/.test(item)) {
  71. itemText += item.toUpperCase();
  72. } else if (/^([A-Z]+)/.test(item)) {
  73. itemText += item.toLowerCase();
  74. } else {
  75. itemText += item;
  76. }
  77. });
  78. return itemText;
  79. }
  80. switch (type) {
  81. case 1:
  82. return str.replace(/\b\w+\b/g, function (word) {
  83. return word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase();
  84. });
  85. case 2:
  86. return str.replace(/\b\w+\b/g, function (word) {
  87. return word.substring(0, 1).toLowerCase() + word.substring(1).toUpperCase();
  88. });
  89. case 3:
  90. return ToggleCase(str);
  91. case 4:
  92. return str.toUpperCase();
  93. case 5:
  94. return str.toLowerCase();
  95. default:
  96. return str;
  97. }
  98. }
  99. //4.字符串循环复制,count->次数
  100. function repeatStr(str, count) {
  101. var text = '';
  102. for (var i = 0; i < count; i++) {
  103. text += str;
  104. }
  105. return text;
  106. }
  107. //5.字符串替换
  108. function replaceAll(str, AFindText, ARepText) {
  109. raRegExp = new RegExp(AFindText, "g");
  110. return str.replace(raRegExp, ARepText);
  111. }
  112. //字符替换*,隐藏手机号或者身份证号等
  113. //replaceStr(字符串,字符格式, 替换方式,替换的字符(默认*))
  114. //ecDo.replaceStr('18819322663',[3,5,3],0)
  115. //result:188*****663
  116. //ecDo.replaceStr('asdasdasdaa',[3,5,3],1)
  117. //result:***asdas***
  118. //ecDo.replaceStr('1asd88465asdwqe3',[5],0)
  119. //result:*****8465asdwqe3
  120. //ecDo.replaceStr('1asd88465asdwqe3',[5],1,'+')
  121. //result:"1asd88465as+++++"
  122. function replaceStr(str, regArr, type, ARepText) {
  123. var regtext = '',
  124. Reg = null,
  125. replaceText = ARepText || '*';
  126. //repeatStr是在上面定义过的(字符串循环复制),大家注意哦
  127. if (regArr.length === 3 && type === 0) {
  128. regtext = '(\\w{' + regArr[0] + '})\\w{' + regArr[1] + '}(\\w{' + regArr[2] + '})'
  129. Reg = new RegExp(regtext);
  130. var replaceCount = this.repeatStr(replaceText, regArr[1]);
  131. return str.replace(Reg, '$1' + replaceCount + '$2')
  132. }
  133. else if (regArr.length === 3 && type === 1) {
  134. regtext = '\\w{' + regArr[0] + '}(\\w{' + regArr[1] + '})\\w{' + regArr[2] + '}'
  135. Reg = new RegExp(regtext);
  136. var replaceCount1 = this.repeatStr(replaceText, regArr[0]);
  137. var replaceCount2 = this.repeatStr(replaceText, regArr[2]);
  138. return str.replace(Reg, replaceCount1 + '$1' + replaceCount2)
  139. }
  140. else if (regArr.length === 1 && type === 0) {
  141. regtext = '(^\\w{' + regArr[0] + '})'
  142. Reg = new RegExp(regtext);
  143. var replaceCount = this.repeatStr(replaceText, regArr[0]);
  144. return str.replace(Reg, replaceCount)
  145. }
  146. else if (regArr.length === 1 && type === 1) {
  147. regtext = '(\\w{' + regArr[0] + '}$)'
  148. Reg = new RegExp(regtext);
  149. var replaceCount = this.repeatStr(replaceText, regArr[0]);
  150. return str.replace(Reg, replaceCount)
  151. }
  152. }
  153. //6.格式化处理字符串
  154. //ecDo.formatText('1234asda567asd890')
  155. //result:"12,34a,sda,567,asd,890"
  156. //ecDo.formatText('1234asda567asd890',4,' ')
  157. //result:"1 234a sda5 67as d890"
  158. //ecDo.formatText('1234asda567asd890',4,'-')
  159. //result:"1-234a-sda5-67as-d890"
  160. function formatText(str, size, delimiter) {
  161. var _size = size || 3, _delimiter = delimiter || ',';
  162. var regText = '\\B(?=(\\w{' + _size + '})+(?!\\w))';
  163. var reg = new RegExp(regText, 'g');
  164. return str.replace(reg, _delimiter);
  165. }
  166. //7.现金额大写转换函数
  167. //ecDo.upDigit(168752632)
  168. //result:"人民币壹亿陆仟捌佰柒拾伍万贰仟陆佰叁拾贰元整"
  169. //ecDo.upDigit(1682)
  170. //result:"人民币壹仟陆佰捌拾贰元整"
  171. //ecDo.upDigit(-1693)
  172. //result:"欠人民币壹仟陆佰玖拾叁元整"
  173. function upDigit(n) {
  174. var fraction = ['角', '分', '厘'];
  175. var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
  176. var unit = [
  177. ['元', '万', '亿'],
  178. ['', '拾', '佰', '仟']
  179. ];
  180. var head = n < 0 ? '欠人民币' : '人民币';
  181. n = Math.abs(n);
  182. var s = '';
  183. for (var i = 0; i < fraction.length; i++) {
  184. s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
  185. }
  186. s = s || '整';
  187. n = Math.floor(n);
  188. for (var i = 0; i < unit[0].length && n > 0; i++) {
  189. var p = '';
  190. for (var j = 0; j < unit[1].length && n > 0; j++) {
  191. p = digit[n % 10] + unit[1][j] + p;
  192. n = Math.floor(n / 10);
  193. }
  194. s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
  195. //s = p + unit[0][i] + s;
  196. }
  197. return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
  198. }
  199. //8.保留2位小数
  200. function toDecimal2(x){
  201. var f = parseFloat(x);
  202. if (isNaN(f)) {
  203. return false;
  204. }
  205. var f = Math.round(x * 100) / 100;
  206. var s = f.toString();
  207. var rs = s.indexOf('.');
  208. if (rs < 0) {
  209. rs = s.length;
  210. s += '.';
  211. }
  212. while (s.length <= rs + 2) {
  213. s += '0';
  214. }
  215. return s;
  216. }
  217. export{
  218. trim,
  219. changeCase,
  220. repeatStr,
  221. replaceAll,
  222. replaceStr,
  223. checkPwd,
  224. formatText,
  225. upDigit,
  226. toDecimal2,
  227. formaDate
  228. }

二、插槽

插槽使用场景是:子组件需要显示的内容并非来自本身而是父组件动态传递进来的,插槽的内容具体是什么是由父视图在调用的时候决定的

  1. //组件
  2. <slot name="header"></slot>
  3. //index.vue
  4. <bs-btn>
  5. <p slot="header">hello world</p>
  6. </bs-btn>

三、在组件中使用全局常量

第一步,在 src 下新建 const 文件夹下 新建 const.js,并在const.js中设置常量

  1. .
  2. ├── src
  3. ├── const
  4. ├── const.js
  5. └── main.js
  6. └── ...
  7. //const.js
  8. export default {
  9. install(Vue,options){
  10. Vue.prototype.global = {
  11. title:'全局',
  12. isBack: true,
  13. isAdd: false,
  14. };
  15. }
  16. }

第二步,在 main.js 下全局引入:

  1. //引入全局常量
  2. import constant from './const/const.js'
  3. Vue.use(constant);

第三步,即可在 .vue 组件中使用:

  1. //通过js方式使用:
  2. this.global.title
  3. //或在 html 结构中使用
  4. {{global.title}}