VueJS$设置有可变密钥路径
VueJS $set with variable keypath
我目前正在开发一个简单的文件管理器组件,该组件由父组件触发。在文件管理器I $dispatch
中选择介质之后;媒体我使用元素来跟踪我希望媒体附加到当前数据对象的位置,并且媒体具有媒体信息(id、类型、名称等)。当我想将媒体数据$set
到数据对象中的变量时,此设置会给我带来一些麻烦。变量是语言环境,所以:nl-nl,de-nl等等
setMediaForPage : function(data){
if(!this.page.media[this.selectedLanguage]['id'])
{
// set for all locales
var obj = this;
this.application.locales.forEach(function(element, index, array) {
obj.$set(obj.page.media[element.locale], data.media);
})
}
else
{
// set for 1 locale
this.$set(this.page.media[this.selectedLanguage], data.media);
}
}
当我运行此代码时,数据对象会正确显示在Vue Devtools数据对象中,但媒体不会显示在模板中。当我切换语言(通过更改this.selectedLanguage
值)时,媒体确实会出现。
我认为这与对象关键路径中的变量有关,但我不能100%确定。关于如何改进此代码,以便在不更改this.selectedLanguage
值的情况下在父组件中显示所选媒体,有什么想法吗?
我不知道你的数据结构,但你当然可以在vue中使用变量作为keypath,但请记住keypath应该是一个字符串,而不是一个对象。
如果你想在keypath中使用的变量是vue的一部分,你可以这样做:
obj.$set('page.media[element.locale]', data.media)
因为字符串keyPath是由Vue的$set方法智能解析的,当然它知道这个路径是相对于$data对象的。
new Vue({
el: '#app',
data() {
return {
msg: "hello world",
attr: {
lang: {
zh: '中文',
en: 'english'
}
}
}
},
methods: {
$set2(obj, propertyName, value) {
let arr = propertyName.split('.');
let keyPath = arr.slice(0, -1).join('.');
let key = arr[arr.length - 1];
const bailRE = /[^'w.$]/
function parsePath(obj, path) {
if (bailRE.test(path)) {
return
}
const segments = path.split('.')
for (let i = 0; i < segments.length; i++) {
if (!obj) return
obj = obj[segments[i]]
}
return obj
}
let target = parsePath(obj, keyPath);
// console.log(target, key);
// target[key] = value;
this.$set(target, key, value);
}
},
mounted() {
setTimeout(() => {
// this.$set('attr.lang.zh', '嗯');
// this.$set2(this, 'attr.lang.zh', '嗯');
this.$set2(this.attr, 'lang.zh', '嗯');
}, 1000);
}
})
调用示例:这个$set2(this.attr,'lang.zh','嗯');
我也遇到过类似的问题,删除变量-
,这些变量nl-NL, de-NL
更改为nlNl, deNl
我不使用
obj.$set('page.media[element.locale]', data.media)
但是
obj.$set('page.media.'+element.locale, data.media);
然后它工作
相关文章:
- API密钥使用和检查示例
- react.js中的密钥绑定
- JS对象密钥序列
- 似乎无法使用javascript从AWS 3S中删除密钥
- 加载两个具有相同父密钥名称的json文件
- 如何获取$data.Entity的密钥
- Angular ngRepeat:重复错误(尽管没有重复的密钥)
- CryptoJS和密钥/IV长度
- 基于api密钥的NodeJS web服务
- 输入密钥和firefox提示
- React Rails应用程序中动态子项的密钥分配问题
- 正在Javascript Cookie中设置重复密钥
- 通过localStorage中的密钥获取ID
- 从密钥中获取价值.JavaScript
- Javascript对象中的跨浏览器密钥查找性能
- D3动态json密钥名称
- OAuth 2.0 OpenID连接环回和密钥斗篷
- 从包含密钥路径的字符串中获取json值
- VueJS$设置有可变密钥路径
- 在嵌套json对象中查找和更新,而不更改不同子路径中的相同密钥对值