gpt4 book ai didi

javascript - 通过字符串路径设置嵌套对象属性

转载 作者:搜寻专家 更新时间:2023-10-30 22:54:31 24 4
gpt4 key购买 nike

我有 3 个选择框,我希望它们在选择时重置某个字段。我怎样才能使它动态化,以便它可以重用?

这是我的代码的摘录:

v-on:select="getDate('{{ route('api.v1.get.date') }}', 'input1', ['form.company.input2', 'form.company.input3'], $event)"

getDate(url, obj, obj2, event){

let current = this

current[obj] = ''
current[obj2[0]] = ''
current[obj2[1]] = ''

}

obj 位于 Vue 实例的根级别(即 current[obj])时,它会正确设置属性;但当 obj 是嵌套对象时则不然。

最佳答案

在 JavaScript 中,property accessors不允许嵌套的对象路径,这是您在点分隔字符串中所拥有的。通过使用该字符串,您实际上是在根 Vue 实例上创建属性,而不是设置嵌套属性,类似于:

this['form.company.input2'] = ''  // XXX: creates `form.company.input2` prop
this.form.company.input2 = '' // sets `input2`

要通过路径设置对象值,您可以创建一个方法,该方法使用对象路径通过 this 导航当前 Vue 实例的数据属性:

methods: {
getDate(url, obj, obj2, event) {
this.setValue(obj, '')
this.setValue(obj2[0], '')
this.setValue(obj2[1], '')
},
setValue(path, value) {
let obj = this
const parts = path.split('.')
while (parts.length > 1 && obj.hasOwnProperty(parts[0])) {
obj = obj[parts.shift()]
}
obj[parts[0]] = value
}
}

new Vue({
el: '#app',
data() {
return {
input1: 'input1',
form: {
company: {
input2: 'input2',
input3: 'input3'
}
}
}
},
methods: {
getDate(url, obj, obj2, event) {
this.setValue(obj, '')
this.setValue(obj2[0], '')
this.setValue(obj2[1], '')
},
setValue(path, value) {
let obj = this
const parts = path.split('.')
while (parts.length > 1 && obj.hasOwnProperty(parts[0])) {
obj = obj[parts.shift()]
}
obj[parts[0]] = value
},
route(prop) {
return prop
}
}
})
<script src="https://unpkg.com/vue@2.6.10"></script>

<div id="app">
<input v-model="input1">
<input v-model="form.company.input2">
<input v-model="form.company.input3">

<button @click="getDate(route('api.v1.get.date'), 'input1', ['form.company.input2', 'form.company.input3'], $event)">
Reset data
</button>
</div>

或者,您可以使用库(例如 lodash_.set ):

methods: {
getDate(url, obj, obj2, event) {
_.set(this, obj, '')
_.set(this, obj2[0], '')
_.set(this, obj2[1], '')
}
}

new Vue({
el: '#app',
data() {
return {
input1: 'input1',
form: {
company: {
input2: 'input2',
input3: 'input3'
}
}
}
},
methods: {
getDate(url, obj, obj2, event) {
_.set(this, obj, '')
_.set(this, obj2[0], '')
_.set(this, obj2[1], '')
},
route(prop) {
return prop
}
}
})
<script src="https://unpkg.com/lodash@4.17.11/lodash.js"></script>
<script src="https://unpkg.com/vue@2.6.10"></script>

<div id="app">
<input v-model="input1">
<input v-model="form.company.input2">
<input v-model="form.company.input3">

<button @click="getDate(route('api.v1.get.date'), 'input1', ['form.company.input2', 'form.company.input3'], $event)">
Reset data
</button>
</div>

关于javascript - 通过字符串路径设置嵌套对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55664609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com