简书原文

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

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

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

源码在最后

演示DEMO

示例:

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

部分设计思路

template

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

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

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

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

(function (window) {
if (window == null || window.Vue == null) {
return;
}
var version = "1.1.0.0";
var template = '<div style="......" ....>\
<ins :style="....." style="...background-image: url(data:image/png;base64,iVBORw0KGgoAA......gg==);..."></ins>\
<span style="display: inline-block;*display: inline;*zoom: 1;vertical-align: middle;">{{text}}</span>\
<slot></slot>\
</div>';
var vue = window.Vue; var vCheckBox = vue.extend({
... ...
template: template
};
vCheckBox.template1 = template;
vCheckBox.version = version;
window.vCheckBox = vCheckBox;
})(window);
作为子组件

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

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

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

data: function () {
var props = this.$options.propsData;
var data = {
_hover: 0,
_readonly: {
text: props && props.hasOwnProperty("text"),
disabled: props && props.hasOwnProperty("disabled"),
checked: props && props.hasOwnProperty("checked")
}
};
if (!data._readonly.text) {
data.text = "";
}
if (!data._readonly.disabled) {
data.disabled = false;
}
if (!data._readonly.checked) {
data.checked = false;
}
return data;
}

在toggle操作的时也需要注意

methods: {
toggle: function () {
if (this.disabled) {
return;
}
var value = this.checked == null ? false : !this.checked;
if (this.$data._readonly.checked) {
this.onChanged(value);
return;
}
this.checked = value;
},
全选

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

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

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

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

vCheckBox.checkAll = function (value, objects, field) {
if (typeof value !== "boolean" || objects == null) {
return;
}
if (typeof field !== "string") {
field = "checked";
}
for (var key in objects) {
if (objects.hasOwnProperty(key)) {
var obj = objects[key];
if (obj && obj.hasOwnProperty(field) && obj[field] !== value) {
obj[field] = value;
}
}
}
};
vCheckBox.isCheckAll = function (objects, field) {
if (objects == null) {
return false;
}
if (typeof field !== "string") {
field = "checked";
}
var value = null;
for (var key in objects) {
if (objects.hasOwnProperty(key)) {
var obj = objects[key];
if (obj && obj.hasOwnProperty(field)) {
if (value == null) {
value = obj[field];
} else if (value !== obj[field]) {
return null;
}
}
}
}
return value;
};

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. iOS端临近封包时要做哪些事情?

    iOS封包前的注意事项: 0.功能测试,打点测试都已OK 1.创建case,使用master执行此轮case,修改版本号 2.建议使用各个系统的机型,如8,9,10,11,12, iPad等 3.ma ...

  2. python3解决 json.dumps中文乱码

    使用json.dumps()运行结果如下 role_name字段中文乱码了 只需要使用ensure_ascii=False 运行结果如下:

  3. webDriver基本运用

    import time from selenium import webdriver import unittest import HTMLTestRunner # webDriver基本应用 cla ...

  4. Moq 在.net Core 单元测试中的使用

    Moq,主要用来伪造接口的实现类,实现方法,属性 moq The most popular and friendly mocking framework for .NET What? Moq (pro ...

  5. git20181122

    git 在线编辑器 http://www.mdeditor.com/git add commit diff log status 代码撤消 # git https://github.com/gyz41 ...

  6. 网络远程唤醒 WOL Magic Packet

    Magic Packet Magic Packet白皮书介绍: The basic technical details of Magic Packet Technologyare simple and ...

  7. Hbase API 简单封装

    >>>>>>>>>>>>>>>>>>>>>>>>> ...

  8. selenium笔记(1)

    selenium笔记(1) 一.关闭页面:1.driver.close() 关闭当前页面2.driver.quit() 退出整个浏览器 二.定位元素:1.find_element_by_id: 根据i ...

  9. 二维条码扫描模组在肯德基KFC的无纸化点餐解决方案

    在如今提倡节约资源的环境下,肯德基在品牌发展中,逐渐实现无纸化点餐,不仅节约了纸质点餐单,而且还具有节约资源的示范作用.而其中二维码扫描模组是这套无纸化点餐方案的重点,在整套设备中,加入二维码扫描模组 ...

  10. 4.BN推导

    参考博客:https://www.cnblogs.com/guoyaohua/p/8724433.html 参考知乎:https://www.zhihu.com/question/38102762/a ...