简书原文

做东西一向奉行的是致简原则,一定要让使用者简单

这是我在使用 Vue 一段时间后尝试制作的一个小玩意

我希望可以做一堆这样的小玩意,随意组合使用,感觉挺好的

源码在最后

演示DEMO

示例:

  • html
  1. <input type="checkbox" id="test1"/>
  • JavaScript
  1. var test1 = new vCheckBox({
  2. el: "#test1",
  3. data: {
  4. text: "测试多选框"
  5. }
  6. });
  • 效果

部分设计思路

template

图片使用base64方式写入css,css写入行内样式

使用template变量保存默认模版,在extend中{ template: template },然后再赋值给全局对象 vCheckBox.template1 = template;

以后可以预制更多不同样式的 template, 在使用中只需要 new vCheckBox( { template : vCheckBox.templateN } )

同样的,如果不想使用任何样式也可以 new vCheckBox( { template : null } )

  1. (function (window) {
  2. if (window == null || window.Vue == null) {
  3. return;
  4. }
  5. var version = "1.1.0.0";
  6. var template = '<div style="......" ....>\
  7. <ins :style="....." style="...background-image: url(data:image/png;base64,iVBORw0KGgoAA......gg==);..."></ins>\
  8. <span style="display: inline-block;*display: inline;*zoom: 1;vertical-align: middle;">{{text}}</span>\
  9. <slot></slot>\
  10. </div>';
  11. var vue = window.Vue;
  12. var vCheckBox = vue.extend({
  13. ... ...
  14. template: template
  15. };
  16. vCheckBox.template1 = template;
  17. vCheckBox.version = version;
  18. window.vCheckBox = vCheckBox;
  19. })(window);
作为子组件

当vCheckbox做为子组件使用时,props: ["checked", "text", "disabled"] 三个属性可以由父组件传入;

由于Vue本身的限制,当属于由props传入时则无法被赋值(会变为只读),这个限制可以参考官方文档

所以在data部分需要对prop进行判断

  1. data: function () {
  2. var props = this.$options.propsData;
  3. var data = {
  4. _hover: 0,
  5. _readonly: {
  6. text: props && props.hasOwnProperty("text"),
  7. disabled: props && props.hasOwnProperty("disabled"),
  8. checked: props && props.hasOwnProperty("checked")
  9. }
  10. };
  11. if (!data._readonly.text) {
  12. data.text = "";
  13. }
  14. if (!data._readonly.disabled) {
  15. data.disabled = false;
  16. }
  17. if (!data._readonly.checked) {
  18. data.checked = false;
  19. }
  20. return data;
  21. }

在toggle操作的时也需要注意

  1. methods: {
  2. toggle: function () {
  3. if (this.disabled) {
  4. return;
  5. }
  6. var value = this.checked == null ? false : !this.checked;
  7. if (this.$data._readonly.checked) {
  8. this.onChanged(value);
  9. return;
  10. }
  11. this.checked = value;
  12. },
全选

为了方便在使用时操作全选判断全选

写了2个独立的函数供调用,可以在判断时指定需要判断的字段的名称field参数,默认为判断对象的checked字段

另外checked状态还提供了额外的半选状态(常见于全选的部分选中,另外一部分未选中

半选状态返回null,不影响true和false的判断 null在if中也会被认为是false,兼容只有2个状态的情况

  1. vCheckBox.checkAll = function (value, objects, field) {
  2. if (typeof value !== "boolean" || objects == null) {
  3. return;
  4. }
  5. if (typeof field !== "string") {
  6. field = "checked";
  7. }
  8. for (var key in objects) {
  9. if (objects.hasOwnProperty(key)) {
  10. var obj = objects[key];
  11. if (obj && obj.hasOwnProperty(field) && obj[field] !== value) {
  12. obj[field] = value;
  13. }
  14. }
  15. }
  16. };
  17. vCheckBox.isCheckAll = function (objects, field) {
  18. if (objects == null) {
  19. return false;
  20. }
  21. if (typeof field !== "string") {
  22. field = "checked";
  23. }
  24. var value = null;
  25. for (var key in objects) {
  26. if (objects.hasOwnProperty(key)) {
  27. var obj = objects[key];
  28. if (obj && obj.hasOwnProperty(field)) {
  29. if (value == null) {
  30. value = obj[field];
  31. } else if (value !== obj[field]) {
  32. return null;
  33. }
  34. }
  35. }
  36. }
  37. return value;
  38. };

github

Vue 单文件原件 — vCheckBox的更多相关文章

  1. webpack入坑之旅(五)加载vue单文件组件

    这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...

  2. Vue单文件组件

    前面的话 本文将详细介绍Vue单文件组件 概述 在很多 Vue 项目中,使用 Vue.component 来定义全局组件,紧接着用 new Vue({ el: '#container '}) 在每个页 ...

  3. VUE2 第六天学习--- vue单文件项目构建

    阅读目录 VUE2 第六天学习--- vue单文件项目构建 回到顶部 VUE2 第六天学习--- vue单文件项目构建 VUE单文件组件在Vue项目中,然后使用 new Vue({el: '#cont ...

  4. vue 单文件 样式写了scoped 不能覆盖框架原有样式的解决办法

    vue 单文件 样式写了scoped 不能覆盖框架原有样式的解决办法 在vue 里面<style scoped></style> 是为了让样式只影响本身自己组件的样式,不改变全 ...

  5. vue 单文件组件

    在很多vue项目中,我们使用vue.component来定义全局组件,紧接着用new Vue({el:'#container'})在每个页面内指定一个容器元素 这种方式在很多中小规模的项目中运作的很好 ...

  6. vue单文件中引用路径的处理

    原文地址:vue单文件中引用路径的处理如有错误,欢迎指正! vue单文件的开发过程中,在单文件模版中可能会涉及到文件路径的处理,比如 <img>, style 中的 background ...

  7. webpack打包vue单文件组件

    一.vue单文件组件 ①文件扩展名为 .vue 的 就是single-file components(单文件组件) ②参考文档:单文件组件 二.webpack加载第三方包 ①项目中,如果需要用到一些第 ...

  8. ts-loader如何与vue单文件组件衔接

    .ts-loader是如何与vue单文件组件衔接作用的 https://github.com/microsoft/TypeScript-Vue-Starter https://www.npmjs.co ...

  9. 基于VSCode的vue单文件组件模板设置---一次设置,可爽终生

    第一步: 第二步: 第三步: 打开vue.json文件后,如果是初次设置,应该如下图所示,绿色注释部分不用管,注意那两个白色大括号 第四步:在大括号内全部粘贴如下代码,保存即可完成vue模板的设置 & ...

随机推荐

  1. 二丶Django~1

      一 什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于 ...

  2. 网络流24题——魔术球问题 luogu 2765

    题目描述:这里 这道题是网络流问题中第一个难点,也是一个很重要的问题 如果直接建图感觉无从下手,因为如果不知道放几个球我就无法得知该如何建图(这是很显然的,比如我知道 $1+48=49=7^2$ ,可 ...

  3. Dubbo序列化多个CopyOnWriteArrayList对象变成同一对象的一个大坑!!

    环境: win10 + jdk 1.8 + dubbo 2.5.10 问题描述: 当一个对象(此对象内包含多个CopyOnWriteArrayList对象) 作为参数调用RPC接口后, 服务提供者拿到 ...

  4. SpringBoot整合Mybatis【非注解版】

    接上文:SpringBoot整合Mybatis[注解版] 一.项目创建 新建一个工程 ​ 选择Spring Initializr,配置JDK版本 ​ 输入项目名 ​ 选择构建web项目所需的state ...

  5. vim的简单使用以及一些常用的命令

    对于第一次用vi,有几点注意要提醒一下:1.用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字.切换方法:在「命令行模式 ...

  6. IDEA和eclipse快捷键

    软件通用的快捷键: * 保存:Ctrl + S * 剪切:Ctrl + X * 粘贴:Ctrl + V * 复制:Ctrl + C * 全选:Ctlr + A * 撤销:Ctrl + Z * 反撤销: ...

  7. java笔记(Idea,Maven):误删maven项目的target的class,怎么再生成target

    右边侧边栏clean一下,target目录删掉了.或是手动删掉了.再建. 跑一下 Tomcat.   target自动生成. 就这样.:)

  8. 业务线B/C端业务组件总结

    /** * 业务线组件总结 * */ /* B端组件的总结 1.组件cssBase的总结 1像素底部边框 */ @mixin border - 1px - b($background: $gray - ...

  9. (转载)Linux终端复用神器-Tmux使用

    Linux终端复用神器-Tmux使用 转载地址:https://blog.51cto.com/652465/2094738 Tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于Open ...

  10. BZOJ5412 : circle

    若仅保留这$k$个点仍然有环,那么显然无解. 否则设$A$表示这$k$个点的集合,$B$表示剩下的点的集合,因为是竞赛图,每个集合内部的拓扑关系是一条链,方便起见将所有点按照在所在集合的链上的位置进行 ...