Vue 单文件原件 — vCheckBox
做东西一向奉行的是致简原则,一定要让使用者简单
这是我在使用 Vue 一段时间后尝试制作的一个小玩意
我希望可以做一堆这样的小玩意,随意组合使用,感觉挺好的
源码在最后
示例:
- 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;
};
Vue 单文件原件 — vCheckBox的更多相关文章
- webpack入坑之旅(五)加载vue单文件组件
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- Vue单文件组件
前面的话 本文将详细介绍Vue单文件组件 概述 在很多 Vue 项目中,使用 Vue.component 来定义全局组件,紧接着用 new Vue({ el: '#container '}) 在每个页 ...
- VUE2 第六天学习--- vue单文件项目构建
阅读目录 VUE2 第六天学习--- vue单文件项目构建 回到顶部 VUE2 第六天学习--- vue单文件项目构建 VUE单文件组件在Vue项目中,然后使用 new Vue({el: '#cont ...
- vue 单文件 样式写了scoped 不能覆盖框架原有样式的解决办法
vue 单文件 样式写了scoped 不能覆盖框架原有样式的解决办法 在vue 里面<style scoped></style> 是为了让样式只影响本身自己组件的样式,不改变全 ...
- vue 单文件组件
在很多vue项目中,我们使用vue.component来定义全局组件,紧接着用new Vue({el:'#container'})在每个页面内指定一个容器元素 这种方式在很多中小规模的项目中运作的很好 ...
- vue单文件中引用路径的处理
原文地址:vue单文件中引用路径的处理如有错误,欢迎指正! vue单文件的开发过程中,在单文件模版中可能会涉及到文件路径的处理,比如 <img>, style 中的 background ...
- webpack打包vue单文件组件
一.vue单文件组件 ①文件扩展名为 .vue 的 就是single-file components(单文件组件) ②参考文档:单文件组件 二.webpack加载第三方包 ①项目中,如果需要用到一些第 ...
- ts-loader如何与vue单文件组件衔接
.ts-loader是如何与vue单文件组件衔接作用的 https://github.com/microsoft/TypeScript-Vue-Starter https://www.npmjs.co ...
- 基于VSCode的vue单文件组件模板设置---一次设置,可爽终生
第一步: 第二步: 第三步: 打开vue.json文件后,如果是初次设置,应该如下图所示,绿色注释部分不用管,注意那两个白色大括号 第四步:在大括号内全部粘贴如下代码,保存即可完成vue模板的设置 & ...
随机推荐
- spring5.0.2.RELEASE源码环境构建
Spring5 源码下载注意事项 首先你的JDK 需要升级到1.8 以上.Spring3.0 开始,Spring 源码采用github 托管,不再提供官网下载链接.大家可自行去github 网站下载, ...
- Scyther-manual ------BNF
1.Scyther 协议安全模型的验证实例 第一部分: 打开协议模型 ,设置攻击变量的参数执行分析 Scyther is a tool for the formal analysis o the ...
- 第一阶段——CentOS6_Python3.6.1笔记(尚学堂-Python基础快速入门)+ 【补充】麦子-Python程序入门与进阶
虚拟机环境: 设置网络 .修改网络地址 .设置网卡为nat模式 .确保物理机启动dhcp.net服务 .编辑文件:vim /etc/sysconfig/network-scripts/ifcfg-et ...
- linux目录的特点
1./是所有目录的顶点. 2.目录结构像一颗倒挂的树 3.目录和磁盘分区,默认是木有关联的 4./不同的目录可能会对应不同的分区或磁盘 linux里设备如果不挂载是看不到入口的, 如果希望设备被访问, ...
- ansible的modules
fetch :从远端服务器拉取文件到本地 dest 依赖 本地存放拉取到的文件路径, 如果flat=yes,则会在该路径下直接存放文件, 如果flat=no,则会在该路径下生成每个服务器的in ...
- Ionic2生成的main.js执行时间10s+
写个随笔记录下. 经过一周多各种莫名其妙的研究与分析,然后在论坛中大神给一个命令完美解决之. ionic build android --prod --release
- Linux磁盘管理及LVM讲解
硬盘接口 硬盘接口分为IDE.SATA.SCSI和SAS四种, IDE接口硬盘多用于家用产品中,也部分应用于服务器.不支持热添加,比较老. SCSI接口的硬盘则主要应用于服务器市场.linux. 而S ...
- 【webpack系列】从零搭建 webpack4+react 脚手架(四)
经过三个章节的学习,你已经学会搭建了一个基于webpack4的react脚手架.如果要更改配置,比如,你希望把编译后的js文件和css文件等单独放dist下的static目录下,你想想,是不是有点麻烦 ...
- Extjs6.2 项目学习系列(一)
1. Extjs开发准备 (1).下载ExtJS SDK GPL版 (本测试用版本 ext-6.2.0) : https://www.sencha.com/legal/gpl/ (2).下载Se ...
- SOUI开发应用展示2
神速加速器 一款网游加速器,下载:http://js.ispeed.cn/downloadPage.html 一款上位机界面,行业软件,不提供下载 : 光速搜索:自己搜索官网,有广告. ABC看图: ...