Quasar Table 未更新 (v1)
Quasar Table not updating (v1)
我有一个 Quasar Table,其中数据 属性 连接到 Vuex 状态(对象数组)。
当对象的状态(table 中的一行)发生变化时,这种变化在table 中是不可见的。
如果我使用 Vue 开发工具查看,奇怪的是 QTable Data 道具确实发生了变化,但 computedData.rows 和 computedRows 没有更新。
如何强制更新 table 行?我希望更改在 table.
中可见
在下图中,您可以看到 table 行未更新,但 table 的数据属性已更新 属性。
在第二张图片中,您可以看到 computerData.rows 属性 未 更新。 table.
的computerRows属性也是如此
下面是QTable的定义方式
<q-table
:data="users"
:columns="columns"
:selection="showSelectors ? 'multiple' : 'none'"
:selected.sync="selected"
:pagination.sync="pagination"
@update:pagination="pageChanged"
hide-header
row-key="id">
<template v-slot:body="props">
<q-tr :props="props" @click.native="click(props.row)" v-touch-hold.mouse="longPress">
<q-td auto-width v-if="showSelectors">
<q-checkbox dense v-model="props.selected" />
</q-td>
<q-td key="name" :props="props">{{ props.row.name }}</q-td>
<q-td key="phone" :props="props">{{ props.row.phone }}</q-td>
</q-tr>
</template>
</q-table>
下面是输入字段的代码:
<q-card class="q-pa-md" v-if="showDetails && !showSelectors" style="margin: 10px 0;" >
<q-icon name="eva-close-circle-outline" class="float-right close-icon" @click="cardClose"/>
<q-input label="Name" color="negative" stack-label v-model="name" />
<q-input label="Phone number" color="negative" stack-label v-model="phone" />
<q-input label="Remarks" color="negative" stack-label v-model="remarks" />
<q-select color="negative" v-model="locks" :options="Locks" label="Locks" multiple @input="selectLock"/>
<q-select color="negative" v-model="schedules" :options="Schedules" label="Schedules" multiple @input="selectSchedule" />
<q-select color="negative" v-model="keys" :options="Keys" label="Keys" multiple @input="selectKey" />
</q-card>
这是我的电脑属性。名称和 Phone 是您在 table 中看到的属性。当您单击 table 行时,将为 table 下方的表单设置 currentUser。这是由 this.$store.commit('users/setCurrentUser', row)
完成的
computed: {
...mapState({
users: state => state.users.users,
currentUser: state => state.users.currentUser,
}),
name: {
set (name) {
this.$store.commit('users/setCurrentUser', { name })
// this.$refs.table.computedData.rows = this.users
},
get () {
return this.currentUser.name
}
},
phone: {
set (phone) {
this.$store.commit('users/setCurrentUser', { phone })
},
get () {
return this.currentUser.phone
}
},
最后是来自 Vuex 商店的代码:
import { getUsers, saveUsers } from '../helpers/database'
export default {
namespaced: true,
state: {
users: [],
currentUser: {}
},
mutations: {
setUsers (state, users) {
state.users = users
},
setCurrentUser (state, payload) {
state.currentUser = Object.assign({}, state.currentUser, payload)
const index = state.users.findIndex(u => u.id === state.currentUser.id)
state.users[index] = state.currentUser
saveUsers(state.users)
}
},
actions: {
getUsers ({ commit }) {
getUsers()
.then(result => {
if (!result) {
saveUsers(seedUsers)
commit('setUsers', seedUsers)
} else {
commit('setUsers', result)
}
})
}
}
}
当您更新您的用户详细信息时,您可以再次调用您的 table 内容
让我们看看我的例子:
<q-td key="status_id" :props="props">
<q-chip tag :color="props.row.status.color">
{{props.row.status.name}}
</q-chip>
<q-popup-edit v-model="props.row.status">
<q-select
v-model="props.row.status"
:value="props.row.status"
:options="selectStatuses"
:placeholder="props.row.status.name"
@input="submitStatus(props.row.status,props.row.id)"
/>
</q-popup-edit>
</q-td>
在我的方法中我有这个:
changeStatus(val,id):{
return new Promise((resolve,reject)=>{
return axiosInstance.put('qc/samples/update/' + id, {status_id: val}).then(response=>{
resolve( Notify.create({type: 'positive', message: 'Status changed successfully'}))
})
})
}
changeStatus(val, id) {
this.submit(val, id).then(
this.request({pagination: this.pagination, filter: this.filter})
)
},
我有两种方法:首先,当我请求 API 路由更改状态时,第二种方法是当 select 输入值更改时提交状态,最后我调用我的当我解决我的承诺时请求重新加载 table 的函数(记住你的第一个函数必须是 Promise)
这是我的请求函数:
request({pagination, filter}) {
this.loading = true
axiosInstance.get('qc/samples?' + qs.stringify(pagination)).then(function (response) {
state.commit('samplesList', response.data.data)
}).catch(function (error) {
Notify.create({type: 'negative', message: error.response.data.message})
})
}
我建议以下解决方案,通过 key-changing
强制 Vue 重新渲染组件
<q-table
:key="tableKey"
...
>
...
</q-table>
data() {
return {
tableKey: 0,
}
},
methods: {
updateData() {
// Vuex logics or others
this.tableKey = 1
}
},
我有一个 Quasar Table,其中数据 属性 连接到 Vuex 状态(对象数组)。 当对象的状态(table 中的一行)发生变化时,这种变化在table 中是不可见的。 如果我使用 Vue 开发工具查看,奇怪的是 QTable Data 道具确实发生了变化,但 computedData.rows 和 computedRows 没有更新。
如何强制更新 table 行?我希望更改在 table.
中可见在下图中,您可以看到 table 行未更新,但 table 的数据属性已更新 属性。
在第二张图片中,您可以看到 computerData.rows 属性 未 更新。 table.
的computerRows属性也是如此下面是QTable的定义方式
<q-table
:data="users"
:columns="columns"
:selection="showSelectors ? 'multiple' : 'none'"
:selected.sync="selected"
:pagination.sync="pagination"
@update:pagination="pageChanged"
hide-header
row-key="id">
<template v-slot:body="props">
<q-tr :props="props" @click.native="click(props.row)" v-touch-hold.mouse="longPress">
<q-td auto-width v-if="showSelectors">
<q-checkbox dense v-model="props.selected" />
</q-td>
<q-td key="name" :props="props">{{ props.row.name }}</q-td>
<q-td key="phone" :props="props">{{ props.row.phone }}</q-td>
</q-tr>
</template>
</q-table>
下面是输入字段的代码:
<q-card class="q-pa-md" v-if="showDetails && !showSelectors" style="margin: 10px 0;" >
<q-icon name="eva-close-circle-outline" class="float-right close-icon" @click="cardClose"/>
<q-input label="Name" color="negative" stack-label v-model="name" />
<q-input label="Phone number" color="negative" stack-label v-model="phone" />
<q-input label="Remarks" color="negative" stack-label v-model="remarks" />
<q-select color="negative" v-model="locks" :options="Locks" label="Locks" multiple @input="selectLock"/>
<q-select color="negative" v-model="schedules" :options="Schedules" label="Schedules" multiple @input="selectSchedule" />
<q-select color="negative" v-model="keys" :options="Keys" label="Keys" multiple @input="selectKey" />
</q-card>
这是我的电脑属性。名称和 Phone 是您在 table 中看到的属性。当您单击 table 行时,将为 table 下方的表单设置 currentUser。这是由 this.$store.commit('users/setCurrentUser', row)
computed: {
...mapState({
users: state => state.users.users,
currentUser: state => state.users.currentUser,
}),
name: {
set (name) {
this.$store.commit('users/setCurrentUser', { name })
// this.$refs.table.computedData.rows = this.users
},
get () {
return this.currentUser.name
}
},
phone: {
set (phone) {
this.$store.commit('users/setCurrentUser', { phone })
},
get () {
return this.currentUser.phone
}
},
最后是来自 Vuex 商店的代码:
import { getUsers, saveUsers } from '../helpers/database'
export default {
namespaced: true,
state: {
users: [],
currentUser: {}
},
mutations: {
setUsers (state, users) {
state.users = users
},
setCurrentUser (state, payload) {
state.currentUser = Object.assign({}, state.currentUser, payload)
const index = state.users.findIndex(u => u.id === state.currentUser.id)
state.users[index] = state.currentUser
saveUsers(state.users)
}
},
actions: {
getUsers ({ commit }) {
getUsers()
.then(result => {
if (!result) {
saveUsers(seedUsers)
commit('setUsers', seedUsers)
} else {
commit('setUsers', result)
}
})
}
}
}
当您更新您的用户详细信息时,您可以再次调用您的 table 内容
让我们看看我的例子:
<q-td key="status_id" :props="props">
<q-chip tag :color="props.row.status.color">
{{props.row.status.name}}
</q-chip>
<q-popup-edit v-model="props.row.status">
<q-select
v-model="props.row.status"
:value="props.row.status"
:options="selectStatuses"
:placeholder="props.row.status.name"
@input="submitStatus(props.row.status,props.row.id)"
/>
</q-popup-edit>
</q-td>
在我的方法中我有这个:
changeStatus(val,id):{
return new Promise((resolve,reject)=>{
return axiosInstance.put('qc/samples/update/' + id, {status_id: val}).then(response=>{
resolve( Notify.create({type: 'positive', message: 'Status changed successfully'}))
})
})
}
changeStatus(val, id) {
this.submit(val, id).then(
this.request({pagination: this.pagination, filter: this.filter})
)
},
我有两种方法:首先,当我请求 API 路由更改状态时,第二种方法是当 select 输入值更改时提交状态,最后我调用我的当我解决我的承诺时请求重新加载 table 的函数(记住你的第一个函数必须是 Promise) 这是我的请求函数:
request({pagination, filter}) {
this.loading = true
axiosInstance.get('qc/samples?' + qs.stringify(pagination)).then(function (response) {
state.commit('samplesList', response.data.data)
}).catch(function (error) {
Notify.create({type: 'negative', message: error.response.data.message})
})
}
我建议以下解决方案,通过 key-changing
强制 Vue 重新渲染组件<q-table
:key="tableKey"
...
>
...
</q-table>
data() {
return {
tableKey: 0,
}
},
methods: {
updateData() {
// Vuex logics or others
this.tableKey = 1
}
},