1.vue中数据向下传递时,无法使用@close方法清除
原因:传递的时候需要进行一波深拷贝
方法:JSON.parse(JSON.stringify(obj))
2.表格选择的时候无法再次点击取消
使用elementui的时候有选中按钮@row-click=”aaa”接下来复写aaa方法
aaa(row){
this.selectRadio = row.id == this.selectRadio?false:row.id
this.selectObj = this.selectRadio?row''
}
3.监听工作使用方法
// watch能监听
var vue = new Vue({
data:{
a:1,
b:[],
c:{
d:2,
e:"3"
},
firstName: ''
},
methods:{
clickMethod(){
this.c.f=4 // 通过点方法给对象添加属性,这时候watch监听不到变化
this.$set(this.c,"f",4) // 通过$set方法添加属性,watch能监听到变化
}
},
watch:{
// 当a的值发生改变时触发
a:function(val,oldVal){
console.log('new:%s,old:%s',val,oldVal)
},
// 数组长度发生变化时触发
b:function(val,oldVal){
console.log('new:%s,old:%s',val,oldVal)
},
// 对象中的属性值发生变化时触发
c:{
handler: function (val, oldVal) {
console.log('new:%s,old:%s',val,oldVal)
},
deep: true // 深度监听,监听到更深层级值的变化
},
// 深度监听对性能影响较大,修改c里面任何一个属性都会触发这个监听器里的 handle。可以做如下处理:
‘c.d': {
handler(newName, oldName) {
console.log('obj.a changed');
},
immediate: true,
// deep: true
},
// 上面的例子是值变化时候,watch才执行,我们想让值最初时候watch就执行就用到了handler和immediate属性
firstName: {
handler(newName, oldName) {
this.fullName = newName + ' ' + this.lastName;
},
// 代表在wacth里声明了firstName这个方法之后立即先去执行handler方法,如果设置了false,那么效果和上边例子一样
immediate: true
}
}
})
4.父传子
//父页面中引用的子组件
<Son :msg="aaa" :user="bbb"></Son>//aaa和bbb是数据或数组,可传多个
//子组件页面接受
props:['msg','user']//data之外
//子页面引用
<p>{{msg}}<p>
<p>{{user}}<p>
//父组件中引入子组件,并且加入ref方式
<Son :ref="aaa"></Son>
//方法中传值进去
this.$refs.Son.name="ccc"
//子组件中要有name这个字段
5.子传父
//子方法里面写入
this.$emit('add',this.selectObj)
//父组件里面写入
<Son @add='addData'></Son>//add对应方法起的名字
//父方法里面获取并使用方法
addData(data){
this.name=data.name
}
6.使用Axios调用接口
//首先引入
import myAxios form 'Axios的地址'
//方法
export const aaa = (data) =>{//aaa是这个方法起的名称data是传入的值
return myAxios ({
url:接口的地址,
method:'post',//这里是看你的方法是post还是get
data,//get就使用params:data
})
}
7.深拷贝数据方法(这里用在查询按钮中)
//查询方法
searcInfo(){
let data = this.form
data['id'] = this.id
data['name'] = this.name
aaa.bbb(data).then((res)=>{//aaa和bbb分别是引入的js文件和js文件中的方法名
this.tableData = []
this.tableData = res.data.list
})
}
//深拷贝处理
submitForm(){//点击查看的时候触用的方法
this.pageNum = 1
this.pageSize = 10
this.form = deepCopyObject(this.form)//deepCopyObject是封装引用的方法
this.searcInfo()//换更新个form数据来调用
}
//deepCopyObject的方法
export function deepCopyObject(obj){
var res = JSON.parse(JSON.stringify(obj))
return res
}
注:深拷贝是拷贝了一个堆粒子数据,不会受其他的影响。浅拷贝的话数据会受其影响浅拷贝,
只拷贝了数据对象的一层数据,拷贝后的数据与原始数据还是有关联数组的concat、slice,对象的assign拷贝
8.VUE中多选框是否选中做操作
//使用v-model绑定,会自动赋予true(选中)或flase(未选中)
<el-checkbox c-model="check" @change="click()">
//data的return中加上check
//写方法判断
click(){
if(this.check==true){
this.$alert("选中")
}else{
this.$alert("未选中")
}
9.动态组件/动态数据ES6写法
//原理:使用(:is)来实现数组转换
<div id="app">
<button @click="changeComponent('coma')">coma</button>
<button @click="changeComponent('comb')">comb</button>
<button @click="changeComponent('comc')">comc</button>
<component :is="com_name"></component>
</div>
<script>
var coma = {
template: '<div>aaaa</div>'
}
var comb = {
template: '<div>bbbb</div>'
}
var comc = {
template: '<div>cccc</div>'
}
let vm = new Vue({
el: '#app',
data: {
com_name: 'coma'
},
components: {
coma: coma,
comb: comb,
comc: comc,
},
methods: {
changeComponent: function(name) {
this.com_name = name
}
}
})
</script>
//动态数组
//原本需要拼接判断的数据:
if(this.canshu=='001'){
this.$refs.son001.open()
}
if(this.canshu=='002'){
this.$refs.son002.open()
}......
//现修改为:
let a = "son"+this.canshu
this.$refs[a].open()
10.字符串的拼接与删除
//字符串部分新增使用的是直接在后面添加配置:
this.data = this.data + ",002"
//字符串的删除我其实是使用了替换的方式replace()
let a = new RegExp(",002")
let a1 = this.data.replace(a,"")//a后面的""是你要替换成的数据,我这边做删除操做,所以传空
this.data = a1
//除此之外,删除方法还有slice()
var str = "hello hgbhggfj!";
console.log("原始字符串是:"+str); // 原始字符串是:hello hgbhggfj!
console.log("删除字符串的第一个字符:"+str.slice(1)); // 删除字符串的第一个字符:ello hgbhggfj!
console.log("删除字符串的最后一个字符:"+str.slice(0, str.length - 1)); // 删除字符串的最后一个字符:hello hgbhggfj
//除此之外,删除方法还有substring()
var str="aabbccdd";
console.log(str.substring(4));
//除此之外,删除方法还有拆散去除然后再拼接重组
var str = "abcdaabbssaaa";
var a = str.split("a").join("");
console.log(a); // bcdbbss
11.VUE中函数的执行顺序
执行顺序beforeCreate ->inject -> Props -> Methods -> Data -> Computed -> Watch ->provide-> created
//例:如果在data中定义一个方法A在Methods中也定义一个A,在执行的过程中会报错Methods的方法未定义,因为Data中的A替换掉了Methods中的A
12.清空新增表单校验方法
this.$refs.form.resetFields();
在使用resetFields()方法时必须满足以下的条件:
1、在表单中使用ref : ref=“form”
<Form ref="form" :model="formData" label-position="right" :label-width="100">
<Row>
<Col span="6">
<FormItem label="文档编号" prop="dtno">
<Input v-model="formData.dtno"></Input>
</FormItem>
</Col>
</Row>
</Form>
13.在title中动态传值进入
<xxx :title="’这里进行传值‘+title">
data () {
return {
title:''//父页面传入或者自写数据
}
}
14.阻止按钮和行同时触发某个方法
openDetail(row,column) {
//column存在的话,说明是点击行触发;
//column不存在的话,说明是点击详情按钮触发;
//判断是否是在操作列点击
if(column && column.label=='操作'){
return;
}
this.detailVisible = true;
},
//加上.native.stop
<el-table-column label="操作" width="200">
<template slot-scope="scope">
<el-button
type="text"
size="medium"
@click.native.stop="editTable(scope.row)"
>编辑</el-button
>
<el-button
type="text"
size="medium"
@click.native.stop="delTable(scope.row.id)"
>删除</el-button
>
</template>
</el-table-column>
15.el-select中@change事件返回对象方法
<el-select v-model="form.dutyHeader" placeholder="请选择" style="width: 100%;"@change="changeOnDutyHeaderBB">
//方法
changeOnDutyHeaderBB(data){
console.log(data)//data一般为绑定的vaule值
}
16.提交验证判断
1.1在页面中引入js验证包,并在rules中书写对应方法
<el-form :rules="rules">
<xxx v-model='form.protocolId' xxx>//因为在form里面做判定,所以用v-model绑定form里面的参数就好
</el-form>
import * as validate form '@/xxx/validate.js'//引入多的判断js
var isNum = validate.isNum
rules:{
protocolId: [
{ required: true, message: '请选择解析协议', trigger: 'blur'},
{ validator:isNum,trigger: 'blur'}
],
},
1.2 validate.js验证
export const isNum =(rule, value, callback) => {
if (value<0) {
callback("请输入大于等于0的数");
}
callback();
};
1.3校验及清除校验方法
this.$refs.form.validateField('protocolId', (valid) => {
//valid返回的是规则集中写的错误提示信息,如果满足条件,返回的就是空
if(!valid){
return
}
})
this.$refs.editFormRef.resetFields();//清除校验方法,建议用这个,这个也可以清除表单
//this.$refs.form.clearValidate();清除校验方法
17.es6合并对象的方法
1.1.利用“Object.assign()”方法,语法“Object.assign(obj1,obj2,obj3)”;
let obj1 = {a: 1}
let obj2 = {b: 2}
let obj3 = {b: 3, c:4}
let obj = Object.assign(obj1, obj2, obj3)
console.log(obj, obj1, obj2, obj3)
//输出
{a: 1, b: 3, c: 4} {a: 1, b: 3, c: 4} {b: 2} {b: 3, c: 4}
1.2.使用扩展运算符
let obj1 = {a: 1}
let obj2 = {b: 2}
let obj3 = {b: 3, c:4}
let objTwo = {...obj1,...obj2,...obj3}
console.log(objTwo, obj1, obj2, obj3)
//输出
{a: 1, b: 3, c: 4} {a: 1, b: 3, c: 4} {b: 2} {b: 3, c: 4}
18.获取到数组进行拆分并循环在首字母前添加一个字符’K’
function(val){
//val为传过来的需要拆分的字符串
let KMain = 'K'
let Data = val.split(",")//以“,”将这个字符串进行拆分为数组
let arr = Data.map((item)=>{
return KMain+item
})
console.log(arr)
},
19.血泪教训,使用checkbox的时候记得看要不要使用checkbox-group
<template>
<el-checkbox-group
v-model="checkedCities"
:min="1"
:max="2">
<el-checkbox v-for="city in cities" :label="city" :key="city">{{city}}</el-checkbox>
</el-checkbox-group>
</template>
<script>
const cityOptions = ['上海', '北京', '广州', '深圳'];
export default {
data() {
return {
checkedCities: ['上海', '北京'],
cities: cityOptions
};
}
};
</script>
//主要是跟checkbox-group里面的v-model里面绑定的数组有关
//<el-checkbox v-for="city in cities" :label="city" :key="city">{{city}}</el-checkbox>中的lable和key可以变为固定的字符串
20.强制失焦方法,有的按钮点击了以后还会显示原来的颜色
//用来强制失焦
if (event.target.nodeName === 'SPAN') {
event.target.parentNode.blur()
} else {
event.target.blur()
}
21.table实现多选框
<el-table
:data="tableData2"
border
style="width: 100%"
ref="checkTable"
@selection-change="handleSelectionChange"
ref="textDocRef"
@row-click="textRowClick"//行点击事件
>
<!-- 在type="selection的列里添加selectable参数,通过函数返回true或false可以设置是否可选" -->
<el-table-column
type="selection"
:selectable="handleDisable"
width="55">
</el-table-column>
.
.
.
</el-table>
methods: {
handleSelectionChange(val) {
console.log('选中的表格', val)
this.list = val
},
textRowClick(row) {
this.$refs.textDocRef.toggleRowSelection(row);
},
// 删除,取消表格选中
removeName(item) {
const arr = this.tableData.filter(sub => { return sub.id === item.id }) // 取消当前表格里的选中状态时,用表格里的数据
const row = arr.length ? arr[0] : item
// console.log(item, row)
this.$refs.checkTable && this.$refs.checkTable.toggleRowSelection(row, false)
},
}
22.数据改变,但页面未变化
1.强制刷新 this.$forceupdate()
2.直接替换数据 this.tableData.splice(0,1,data)
23.页面打开深入传值问题
this.$nextTick(function() {
this .$refs.belongorgSelect.belnotallow=this .form.belongorgName
this.$refs.selectArea.selectedArea=this form.areaCode
})
// let that = this
// this.$nextTick(()=>{
//that.$refs.selectBank.bankName=that.form.bankHeadName//
})
24.验证方法
//在data里面写验证方法
const secondRules = (rule, value, callback) => {
if (this.form.accounts!=this.form.secondAccounts)
callback(new Error(两次账号输入不一致!))
}else {
callback()
}
}
//rules中引用验证
rules:{
secondAccounts:[{validator: secondRules, trigger: "blur'}]
}
//rules记得绑定
25.element-ui checkbox 设置选中为1,未选中为0
<el-checkbox v-model="data" :true-label="1" :false-label="0"></el-checkbox>
26.vue中删除行和新增行方法
//新增行push方法
//比如你有个数组,叫data[id:'',index:'0'],然后你在新增的方法里面里面这样写
add(){
var addData={
id:'',
index:this.data.length
}
this.data.push(addData)
},
//多行删除
delete(){
const q = this.list.map(item=>item.index)//this.list为选中的集合,这个方法是从选中的集合中拿出选中index为一个数组
var b = b.filter((item)=>!q.includes(item.index))
}
//单行删除
//传入的方法
<template slot-scope="scope">
<el-button
@click="delete(scope.$index)"
>
</el-button>
<template>
delete(index){
this.data.splice(index,1)
}
27.productionSourceMap失效
module.exports = {
productionSourceMap: false,
publicPath:"auto",
...
...
chainWebpack(config) {
// config.devtool('source-map') 这样写会不生效
// 正确写法以下方形式为准,判断一下环境
config.devtool(process.env.NODE_ENV ===
"production" ? false : 'source-map');
// 或者
config.devtool(config.mode === "production" ? false : 'source-map');
}
}
28.vue过滤器filter的用法
const aaa = reactice({data[
{
value:'1',
text:"这是1"
},
{
value:'2',
text:"这是2"
},
{
value:'3',
text:"这是3"
},
]})//利用一个list集合来过滤信息
//使用
const data = ref('1')
const textData = aaa.filter((item)=>(aaa.data.value == data.value))[0].text
文章版权声明
1 原创文章作者:ARK-16,如若转载,请注明出处: https://www.52hwl.com/37478.html
2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈
3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)
4 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别