Skip to content

Commit 97bf0c7

Browse files
committed
fix: use deep watch instead of cimputed for data update
1 parent 70653e3 commit 97bf0c7

File tree

6 files changed

+121
-24
lines changed

6 files changed

+121
-24
lines changed

playground/layouts/default/DefaultNav.vue

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
<div id="navbarDefault" :class="['collapse navbar-collapse', navbarExpanded && 'show']">
1717
<ul class="navbar-nav mr-auto">
1818
<li class="nav-item">
19-
<router-link to="/" class="nav-link" @click="collapseNavbar">Example1</router-link>
19+
<router-link to="/" class="nav-link" @click="collapseNavbar">Options API</router-link>
2020
</li>
2121
<li class="nav-item">
22-
<router-link to="/example2" class="nav-link" @click="collapseNavbar">Example2</router-link>
22+
<router-link to="/composition-api" class="nav-link" @click="collapseNavbar">Composition API</router-link>
2323
</li>
2424
</ul>
2525
</div>

playground/router/index.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
1-
import Example1 from '../views/Example1.vue'
1+
import OptionsApi from '../views/OptionsApi.vue'
22
import { createRouter, createWebHashHistory } from 'vue-router'
33

44
const history = createWebHashHistory()
55
const routes = [
66
{
77
path: '/',
8-
name: 'Example1',
9-
component: Example1,
8+
name: 'OptionsApi',
9+
component: OptionsApi,
1010
meta: {
1111
layout: 'default'
1212
}
1313
},
1414
{
15-
path: '/example2',
16-
name: 'Example2',
15+
path: '/composition-api',
16+
name: 'CompositionApi',
1717
// route level code-splitting
1818
// this generates a separate chunk (about.[hash].js) for this route
1919
// which is lazy-loaded when the route is visited.
20-
component: () => import(/* webpackChunkName: "example2" */ '../views/Example2.vue'),
20+
component: () => import(/* webpackChunkName: "composition-api" */ '../views/CompositionApi.vue'),
2121
meta: {
2222
layout: 'default'
2323
}

playground/views/Example2.vue playground/views/CompositionApi.vue

+28
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
<button type="button" class="btn btn-primary ml-1" @click="setData1">Set users 1</button>
66
<button type="button" class="btn btn-primary ml-1" @click="setData2">Set users 2</button>
77
<button type="button" class="btn btn-primary ml-1" @click="setDataAll">Set users all</button>
8+
<button type="button" class="btn btn-primary ml-1" @click="addOne">Add one user</button>
9+
<button type="button" class="btn btn-primary ml-1" @click="removeOne">Remove one user</button>
810
</div>
911
<dataset
1012
v-slot="{ ds }"
@@ -69,6 +71,24 @@ const users2 = clone(jsonUsers).slice(13, 25)
6971
const usersAll = clone(jsonUsers)
7072
7173
const users = ref([])
74+
75+
const user = {
76+
_id: 'EA265B20-45F2-953C-C534-3E2A78620ins',
77+
isActive: true,
78+
onlineStatus: 'Do not disturb',
79+
balance: 10000,
80+
birthdate: '1978-12-24',
81+
favoriteColor: 'orredange',
82+
firstName: 'Inserted',
83+
lastName: 'User',
84+
name: 'Inserted User',
85+
company: 'Inserted AG',
86+
87+
phone: '(0112) 192 5651',
88+
address: 'P.O. Box 98, 571 Inserted Rd.',
89+
favoriteAnimal: 'cat'
90+
}
91+
7292
const statusClass = {
7393
Active: 'text-success',
7494
Away: 'text-warning',
@@ -92,4 +112,12 @@ const setDataAll = () => {
92112
const updateDsData = (data) => {
93113
console.log(data)
94114
}
115+
116+
const addOne = () => {
117+
users.value.unshift(user)
118+
}
119+
120+
const removeOne = () => {
121+
users.value.splice(0, 1)
122+
}
95123
</script>

playground/views/Example1.vue playground/views/OptionsApi.vue

+29
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
<button type="button" class="btn btn-primary ml-1" @click="setData1">Set users 1</button>
66
<button type="button" class="btn btn-primary ml-1" @click="setData2">Set users 2</button>
77
<button type="button" class="btn btn-primary ml-1" @click="setDataAll">Set users all</button>
8+
<button type="button" class="btn btn-primary ml-1" @click="addOne">Add one user</button>
9+
<button type="button" class="btn btn-primary ml-1" @click="removeOne">Remove one user</button>
810
</div>
911
<dataset
1012
v-slot="{ ds }"
@@ -13,6 +15,7 @@
1315
:ds-sortby="['name']"
1416
:ds-search-in="['balance', 'birthdate', 'name', 'company', 'email', 'phone', 'address', 'favoriteAnimal']"
1517
:ds-search-as="{}"
18+
@update:ds-data="updateDsData"
1619
>
1720
<div class="row mb-2" :data-page-count="ds.dsPagecount">
1821
<div class="col-md-6 mb-2 mb-md-0">
@@ -66,6 +69,23 @@ const users1 = clone(jsonUsers).slice(0, 12)
6669
const users2 = clone(jsonUsers).slice(13, 25)
6770
const usersAll = clone(jsonUsers)
6871
72+
const user = {
73+
_id: 'EA265B20-45F2-953C-C534-3E2A78620ins',
74+
isActive: true,
75+
onlineStatus: 'Do not disturb',
76+
balance: 10000,
77+
birthdate: '1978-12-24',
78+
favoriteColor: 'orredange',
79+
firstName: 'Inserted',
80+
lastName: 'User',
81+
name: 'Inserted User',
82+
company: 'Inserted AG',
83+
84+
phone: '(0112) 192 5651',
85+
address: 'P.O. Box 98, 571 Inserted Rd.',
86+
favoriteAnimal: 'cat'
87+
}
88+
6989
export default {
7090
name: 'Home',
7191
data() {
@@ -89,6 +109,15 @@ export default {
89109
},
90110
setDataAll() {
91111
this.users = usersAll
112+
},
113+
updateDsData(data) {
114+
console.log(data)
115+
},
116+
addOne() {
117+
this.users.unshift(user)
118+
},
119+
removeOne() {
120+
this.users.splice(0, 1)
92121
}
93122
}
94123
}

src/Dataset.vue

+4-16
Original file line numberDiff line numberDiff line change
@@ -85,19 +85,6 @@ export default {
8585
dsPage.value = value
8686
}
8787
88-
const whenChanged = computed(() => {
89-
/* eslint-disable no-unused-expressions */
90-
props.dsData
91-
dsSearch.value
92-
props.dsSortby
93-
props.dsFilterFields
94-
props.dsSearchIn
95-
props.dsSearchAs
96-
props.dsSortAs
97-
98-
return Date.now()
99-
})
100-
10188
const dsRows = computed(() => {
10289
return dsIndexes.value.slice(dsFrom.value, dsTo.value)
10390
})
@@ -128,8 +115,8 @@ export default {
128115
})
129116
130117
watch(
131-
whenChanged,
132-
(newVal, oldVal) => {
118+
() => [props.dsData, dsSearch, props.dsSortby, props.dsFilterFields, props.dsSearchIn, props.dsSearchAs, props.dsSortAs],
119+
() => {
133120
let result = []
134121
135122
if (!dsSearch.value && !props.dsSortby.length && isEmptyObject(props.dsFilterFields)) {
@@ -165,7 +152,8 @@ export default {
165152
)
166153
},
167154
{
168-
immediate: true
155+
immediate: true,
156+
deep: true
169157
}
170158
)
171159

tests/unit/Dataset.spec.js

+52
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import DatasetPager from '@/DatasetPager.vue'
55
import DatasetSearch from '@/DatasetSearch.vue'
66
import DatasetShow from '@/DatasetShow.vue'
77
import { mount } from '@vue/test-utils'
8+
import { nextTick, ref } from 'vue'
89

910
import users from '../../example-data/users.json'
1011
import { clone, waitNT } from '../../tests/utils.js'
@@ -168,4 +169,55 @@ describe('Dataset', () => {
168169

169170
expect(wrapper.emitted()['update:dsData'][1][0]).toHaveLength(4)
170171
})
172+
173+
it('updates when a new object is pushed or deleted', async () => {
174+
const Container = {
175+
template: `
176+
<Dataset :ds-data="datasetUsers">
177+
<DatasetItem>
178+
<template #default="{ row, rowIndex }">
179+
<div class="name">{{ row.name }}</div>
180+
</template>
181+
<template #noDataFound>
182+
<p class="text-center">No results found</p>
183+
</template>
184+
</DatasetItem>
185+
</Dataset>
186+
`,
187+
components: { Dataset, DatasetItem },
188+
setup() {
189+
const datasetUsers = ref([])
190+
191+
const addOne = () => {
192+
const oneUser = { name: 'George' }
193+
194+
datasetUsers.value.unshift(oneUser)
195+
}
196+
197+
const removeOne = () => {
198+
datasetUsers.value.splice(0, 1)
199+
}
200+
201+
return {
202+
datasetUsers,
203+
addOne,
204+
removeOne
205+
}
206+
}
207+
}
208+
209+
const wrapper = mount(Container)
210+
211+
wrapper.vm.addOne()
212+
213+
await nextTick()
214+
215+
expect(wrapper.find('.name').text()).toBe('George')
216+
217+
wrapper.vm.removeOne()
218+
219+
await nextTick()
220+
221+
expect(wrapper.find('p.text-center').text()).toBe('No results found')
222+
})
171223
})

0 commit comments

Comments
 (0)