常规取值
jswindow.onresize = () => {
return (() => {
window.screenHeight = window.innerHeight;
this.screenHeight = window.screenHeight;
})()
}
mixins--定义一部分公共的方法或者计算属性,然后混入到各个组件中使用,方便管理与统一修改
jsconst resizeScreen = {
data() {
return {
screenHeight : window.innerHeight,//屏幕高度
visibleHeight : window.innerHeight, // 屏幕高度
screenWidth : window.innerWidth,//屏幕高度
visibleWidth : window.innerWidth, // 屏幕高度
}
},
mounted() {
let _this = this;
this.$nextTick(() => {
window.onresize = function () { // 定义窗口大小变更通知事件
return (() => {
window.screenHeight = window.innerHeight;
_this.screenHeight = window.screenHeight;
window.screenWidth = window.innerWidth;
_this.screenWidth = window.screenWidth;
})()
};
})
},
watch : {
screenHeight(val) { //监听屏幕高度变化
this.screenHeight = val;
this.visibleHeight = this.screenHeight
},
screenWidth(val) { //监听屏幕高度变化
this.screenWidth = val;
this.visibleWidth = this.screenWidth
},
}
};
export default resizeScreen
click.prevent 阻止默认事件
click.stop 阻止按钮事件冒泡
普通跨组件验证
js submitForm() {//子组件验证回调
return this.$refs.moreintentionRef.validate()
},
this.$refs.moreIntentionRef.submitForm().then((valid) => {//父组件使用
if(valid){
this.dialogVisible = true
}
}, () => {
this.$message.error("请检查必填项!!!!")
})
动态表单验证
js//data,动态表单数据
for (let i in data){
let refName = `dynamicValidateForm${i}`
let itemName = `Verify${i}`
this.$refs.addProblemRef.getProblemVerify(refName,itemName)//调用子类问题验证,多表单提交验证,将结果装进数组
}
js /**
*@param [refName] [表单ref,动态生成]
*@param [str][装动态验证值]
**/
getProblemVerify(refName,str){//多动态表单验证
str = new Promise((resolve,reject)=>{
this.$refs[refName][0].validate((valid)=>{
if (valid) {
resolve(true)
} else {
reject(false)
}
})
})
this.validateList.push(str)//将验证信息存储
},
jsPromise.all(this.$refs.addProblemRef.validateList).then(()=>{//验证Promise生成数据
//console.log("动态表单验证成功!")
})
vue<el-tabs type="border-card" v-model="tabindex" tab-position="left" style="margin: 10px" :style="{'height':fullHeight+'px'}" > <template v-for="item in tabs" > <el-tab-pane :name="item.dictId" :label="item.label"> <div style="height: 100%;"> <component :is=item.content :height="fullHeight" :ref="`ref${item.dictId}`"></component> </div> </el-tab-pane> </template> </el-tabs>
js tabs : [
{
dictId : '1001',
label : '客源信息',
content : 'base-information'//组件名
},{
dictId : '1002',
label : '客配房',
content : 'c-m-h-index'
}
]
="ref${item.dictId}
动态调用子组件方法使用方法如下:
jsthis.$refs[`ref${this.tabindex}`][0].子组件方法名
js在生命周期updated中使用
updated (){
this.speechScrollDown()
},
jsspeechScrollDown(){
this.$refs['speechScrollbarRef'].wrap.scrollTop = this.$refs['speechScrollbarRef'].wrap.scrollHeight
},
动态表单生成时,element-ui只支持value属性,字段不同时需自行跟换
js/**
*@param [content][数据当前的属性]
*@param [value][需要跟换而成的数据]
**/
let keyMap = {
"content" : "value",
};
js/**
*@param [keyMap][需要跟换属性的json]
*@param [list][需要跟换的数据]
**/
export function attributeReplace(keyMap,list){
for(let i = 0;i < list.length;i++){
let obj = list[i];
for(let key in obj){
let newKey = keyMap[key];
if(newKey){
obj[newKey] = obj[key];
delete obj[key];
}
}
}
return list
}
js/**
*@param [val1][对象1]
*@param [val2][对象2]
*@return boolean
**/
export function objectContrast(val1,val2){
for (let propName in val1) {
if (val1.hasOwnProperty(propName) != val2.hasOwnProperty(propName)) return false
if (typeof val1[propName] != typeof val2[propName]) return false
}
for (let propName in val2) {
if (val1.hasOwnProperty(propName) != val2.hasOwnProperty(propName)) return false
if (typeof val1[propName] != typeof val2[propName]) return false
// if(!this.hasOwnProperty(propName)) continue
if(val1[propName] !== val2[propName]) return false
if (val1[propName] instanceof Array && val2[propName] instanceof Array) {
if (!val1[propName].equals(val2[propName])) return false
} else if (val1[propName] instanceof Object && val2[propName] instanceof Object) {
if (!val1[propName].equals(val2[propName])) return false
} else if (val1[propName] != val2[propName]) {
return false
}
}
return true
}
内容可能是一般数据也可能是Object
js/**
* 比较两个数组是否相等
* @return boolean
*@param [val1][数组1]
* @param [val2][数组2]
* **/
export function arrayContrast(val1,val2){
if (val1.length != val2.length) return false
for (var i = 0, l = val1.length; i < l; i++) {
if (val1[i] instanceof Array && val2[i] instanceof Array) {
if (!val1[i].equals(val2[i])) return false
}else if (val1[i] instanceof Object && val2[i] instanceof Object) {
if(objectContrast(val1[i],val2[i])){//调用对象比较
continue
}else{
return false
}
}else if (val1[i] !== val2[i]) {
return false
}
}
return true
}
内容属性必须是value,验证时可直接使用elemen-ui中form表单方法验证
prop内容显示必须
="'domains.' + index + '.value'"格式动态属性与默认属性不相同时可使用方法6
vue<el-form :model="dynamicValidateForm" ref="dynamicValidateForm" label-width="40px"> <el-form-item :show-message ='false' v-for="(domain, index) in dynamicValidateForm.domains" :label="index + 1+'、'" :prop="'domains.' + index + '.value'" :key="domain.key" :rules="{ required: true, message: ' ', trigger: 'blur'}"> <div style="display: flex;flex-direction: row;width: 100%;"> <div class="inputLeft"> <el-input size="mini" :autosize="{ minRows: 1, maxRows: 4}" type="textarea" :rows="1" v-model="domain.value"></el-input> </div> <div class="buttonRight" > <div id="buttonright"> <el-button icon="el-icon-delete" size="mini" type="danger" @click.prevent="removeDomain(domain)"></el-button> </div> </div> </div> </el-form-item> </el-form>
js removeDomain(item) {//删除
let index = this.dynamicValidateForm.domains.indexOf(item)
if (index !== -1) {
this.dynamicValidateForm.domains.splice(index, 1)
}
},
复杂数据验证看方法3
vue<template v-for="(item,index) in problemArrayList"> <el-form :model="item" :ref="'dynamicValidateForm'+ index" label-width="40px" class="demo-dynamic form_label_item"> ...内部数据与方法8相同 </el-form> </template>
v-model="item.checked" 数据必须
vue<template v-for="item in dataList"> <div> <el-checkbox :value="item" v-model="item.checked"> <div style="background-color:#F8F8F8;margin: 5px 15px 0px 15px;"> <span class="checkbox_span"> {{item.content}} </span> </div> </el-checkbox> </div> </template>
使用计算属性动态生成选中数据
jscomputed : {
foos(){
return this.dataList.filter(x => {if(x.checked === true){return true}})//生成数据对象
//.map可生成数据id
}
},
记录学习
js/**
* 区间处理字段转为显示字符串
* 面积区间,楼层区间,价格区间处理
* @param [val1] [区间开始]
* @param [val2] [区间结束]
* @param [str] [区间单位]
* @param [up] [表示无不限]
* @param [down] [表示以下]
* @return [返回拼接字符串]
* @exception/throws [val1,val2] [可缺省]
* */
export function sectionToString(val1,val2,str,up ='不限',down='以下'){
let flag1 = ![null, undefined, ''].includes(val1)
let flag2 = ![null, undefined, ''].includes(val2)
let sectionstring = flag1 ? flag2 ? typeof val2 === 'string' ? `${val1}${str}~${val2}` : `${val1}-${val2}${str}` : `${val1}${str}~${up}` : flag2 ? `${val2}${str}${down}` : ''
//代码可读注释| 1 ? { 1t2 ? (1t2t3 ? 1t2t3t : 1t2t3f) : 1t2f } : 1f2 ? 1f2t : 1f2f
// 1 :val1不为空
// 2 :val2不为空
// 3 :typeof val2 === 'string' 判断val2等于字符串
//1t2 : 条件1为true 并执行条件2
//1f2 : 条件1为false 并执行条件2
//1t2t3 : 条件1 2 为true 并执行条件3
//1t2t3t : 条件1 2 3都为true -------------------------执行结果:50/万元 -不限
//1t2t3f : 条件1 2 为true 条件三为false---------------执行结果:50-100/万元
//1t2t : 条件1 2 为true
//1t2t3t : 条件1 2 3 为true
//1t2f : 条件1为true 条件2位false--------------------执行结果:50/万元 -不限
//1f2t : 条件1为false 条件2位true--------------------执行结果:100/万元以下
//1f2f : 条件1位false 条件2位false-------------------执行结果:null
return sectionstring
}
其他组件瀑布流加载方式与之一样
组件调用时 v-scrollbar="scrollbar" [scrollbar]中写具体方法
js/**
*el-scrollbar瀑布流触底加载
*/
Vue.directive('scrollbar',{
bind(el,binding){
const selectWrap = el.querySelector('.el-scrollbar__wrap');
selectWrap.addEventListener('scroll', function () {
if (this.scrollTop !== 0 && this.scrollHeight - this.scrollTop - this.clientHeight === 0) {
binding.value();
}
})
}
})
import merge from 'webpack-merge'
jsthis.$router.push({
query : merge({},{uuid : uuidC,params : paramsC})
})
jsexport default {
bind(el,binding,vnode){
function documentHandler(e){
if(el.contains(e.target)){
return false;
}
if(binding.expression){
binding.value(e)
}
}
el._vueClickOutside_ = documentHandler;
document.addEventListener('click',documentHandler);
},
unbind(el,binding){
document.removeEventListener('click',el._vueClickOutside_);
delete el._vueClickOutside_;
}
}
jsimport dropdown from './dropdown'
//用法,需要使用页面路径引入:import elHouseType from '@/directive/el-hosuType'
//页面注册命令: directives: { elHouseType }
//模块化单独引用,禁止改动
//不全局引用
const install = function(Vue) {
Vue.directive('clickoutside', dropdown)
}
if (window.Vue) {
window['clickoutside'] = dropdown
Vue.use(install); // eslint-disable-line
}
dropdown.install = install
export default dropdown
祖先组件 `v-on
="getHouseList"
子组件 `v-bind="listeners" ,也可$emit
孙组件`$emit
16.祖先组件直接传值到最底层组件(等找到能响应式更新写上来)
jsprovide: {
height: 100
},
jsinject : ['height'],//接收,使用是直接this.height
jssubmitForm() {//父组件调用并验证
return this.$refs.moreintentionRef.validate()
},
jsreturn new Promise((resolve,reject)=>{//子组件验证后将结果封装传给父组件(适合多种表单子组件公用),只返回验证通过的值,且只有一个参数 this.$refs.comming.validate((valid)=>{ if (valid) { resolve({flag : true,value : this.commingForm}) } else { this.$message.error("请填写必填项!") } }) })
jscommingFormsubmit(){//父组件配合方法4使用 this.$refs[`ref${this.tabindex}`][0].submitForm().then((valid)=>{ switch (this.tabindex) {// case "1001": this.saveBasicInformation(valid.value) } }) }
本文作者:还是夸张一点
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!