您的位置:首页 > Web前端 > Vue.js

Vue使用问题解决记录(持续更新)

2018-07-18 17:37 681 查看

1 this属性调用无效

this在methods中的方法表面调用,表明调用的是当前vue对象.

但在方法内部的方法中调用时,所指便不再是vue对象,可能式窗口本身.

此时建议,在methods中的方法开始时写:

var that=this;
//或者var self=this;

此后内部调用that即可.

2 打印vue中的对象时,属性对应一堆方法,无法查看具体值

如某vue对象中的data有一个名为mainData的对象,利用对象克隆,即可查看到此时(!)该对象对应的值.

写法:

console.log(JSON.parse(JSON.stringify(mainData)));

3.设置数组中的某个索引值或对象中的某个属性值时,变化无效

该问题也是新手经常遇到的问题,具体原因不表,此处只说办法.

this.arrData[0]='123';
this.mData.name='yys';
//以上写法均不会生效,应改为以下的写法
Vue.set(this.arrData,0,'123');
Vue.set(this.mData,'name','yys');

4.watch对象,内部属性值改变后不触发watch方法

也是常见问题之一,如:

watch:{
mData:function(newVal,oldVal){
//当内部属性name变更时,默认情况不会触发该方法
console.log(newVal);
}
}

改为以下写法即可:

watch:{
mData:{
handler:function(nv,ov){
//可触发
console.log(nv);
},
//核心所在
deep:true
}
},

5.有时将对象集合的某属性值设为空值(空字符串),每个对象的表现都一样(显示相同的值)

该问题,推测是vue的确认机制造成的,建议对于明确有意义的值,不要设定为空字符串;

如我常将数字组成的默认值设为0或-1,而将字符串构成的默认值设为'--';

6.对于插件类组成的新样式,不知道怎么用vue

以select2为例,可以使用组件的方式实现(参考yys写的插件),具体就不展开了.

大体原则是,利用插件本身的api.

7.watch对象时,新旧值相同的问题

在问题4中,如果监听的是一个对象或数组,设置deep:true,每次值变更的时候会触发方法,但新值和旧值总是一样的.具体原因此处不再解释(简单的说,可根据指针理解),仅提出解决方案:

譬如说,监听的是vue中名为mainData的对象.

此时需要创建一个记录mainData的旧值;

在每次监听函数开始时,把oldMainData当做旧值;

而在监听函数结束时,将mainData的值克隆给oldMainData即可.

var vueMain=new Vue({
el:'#main_zone',
data:{
mainData:{},
oldMainData:{}
},
watch:{
//此监听函数中,第二个参数(旧值)总和第一个参数相同,所以没有调用必要
mainData:function(nv){
var ov=this.oldMainData;
if(nv.count!==ov.count||nv.price!==ov.price){
if(!isNaN(nv.price)&&!isNaN(nv.count)){
nv.money=nv.price*nv.count;
}else{
nv.money='';
}
}
//最后一步,必须将nv的值克隆给oldMainData
this.oldMainData=JSON.parse(JSON.stringify(nv));
}
}
});

8.有时选择完vue组成的select2,change时值已给定,但显示不改变的问题

给定一个具体的初始值,如常用的'--'或0.

9.监听vue组成的select2值改变

共计两种方法,目前来看第2种更好:

数据监听,具体参考7;

修改vue组成的select2插件,利用onChange属性(参考以下代码).

Vue.component('select2', {
props: ['options', 'value','other_config','onChange','location'],
template: '<select>' +
'<slot></slot>' +
'</select>',
mounted: function() {
var vm = this;
var config2={data:this.options};
//允许其他配置,如宽度
config2=Object.assign(config2,this.other_config);
$(this.$el)
// init select2
.select2(config2)
.val(this.value)
.trigger('change')
// emit event on change.
.on('change', function() {
vm.$emit('input', this.value);
if(vm.onChange){
//注:该方法会触发两次,且仅在第二次改变之后才会被触发(暂无更好方法)
if(this.oldVal!==this.value){
this.oldVal2=this.oldVal;
vm.onChange(this.value,this.oldVal2,vm.location);
}
this.oldVal=this.value;
}
});
},
watch: {
value: function(value) {
// update value
//此处额外添加的适应事件
var vm = this;
$(this.$el)
.val(value)
.trigger('change');
// .on('change', function() {
//    vm.$emit('input', this.value)
// if(typeof vm.onChange!=='undefined'){
//     vm.onChange(this.value);
// }
// });
},
options: function(options) {
// update options
var config2={data:options};
//允许其他配置
config2=Object.assign(config2,this.other_config);
$(this.$el).empty().select2(config2);
},
other_config:function(other_config){
var config2={data:this.options};
//允许其他配置
config2=Object.assign(config2,other_config);
$(this.$el).empty().select2(config2);
}
},
destroyed: function() {
$(this.$el).off().select2('destroy')
}
})
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Select2 Vue.js
相关文章推荐