Skip to content

Commit 9ca5bc6

Browse files
committed
support for non-binding objects
1 parent 3a4cadf commit 9ca5bc6

File tree

5 files changed

+30
-88
lines changed

5 files changed

+30
-88
lines changed

package-lock.json

+3-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

playground/App.vue

+11-48
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,29 @@
11
<script setup lang="ts">
22
import { vQueryParam } from "../src";
3-
import { computed, ref } from "vue";
3+
import { ref } from "vue";
44
import VueDatePicker from "@vuepic/vue-datepicker";
55
import '@vuepic/vue-datepicker/dist/main.css'
6-
import DatePicker from "./DatePicker.vue"
76
8-
9-
const filter = ref("")
10-
const date = ref("")
11-
const datestr = computed(() => `${date.value}`)
12-
const filterstr = computed(() => `${filter.value}`)
13-
const mirey = ref("")
14-
const search = ref("")
15-
const radiomodel = ref("Valor 1")
7+
const date = ref()
8+
const search = ref(0)
169
const selectmodel = ref("")
17-
const checkmodel = ref(true)
18-
19-
function handlerFilter(id: string, value: string) {
20-
switch (id) {
21-
case "filter":
22-
filter.value = value
23-
break;
24-
case "mirey":
25-
mirey.value = value
26-
break;
27-
case "radio":
28-
radiomodel.value = value
29-
break
30-
case "checkin":
31-
checkmodel.value = value
32-
break
33-
}
34-
}
3510
3611
</script>
3712

3813
<template>
39-
<!-- <select v-model="selectmodel" v-query-param:selecto="selectmodel">
14+
<input type="number" v-model="search" v-query-param:q="search" />
15+
<select v-model="selectmodel" v-query-param:selecto="selectmodel">
4016
<option value="">Please select one</option>
4117
<option>A</option>
4218
<option>B</option>
4319
<option>C</option>
44-
</select> -->
45-
<!-- <div v-query-param:radio="radiomodel">
46-
<span>Radio inputs</span>
47-
<input type="radio" value="Valor 1" name="radioinput" v-model="radiomodel" />
48-
<input type="radio" value="Valor 2" name="radioinput" v-model="radiomodel" />
49-
<input type="radio" value="Valor 3" name="radioinput" v-model="radiomodel" />
50-
{{ radiomodel }}
51-
</div> -->
52-
<!-- <div>
53-
<span>checkbox</span>
54-
<input type="checkbox" v-model="checkmodel" true-value="yes" false-value="no" v-query-param:checkin="checkmodel" />
55-
</div>
56-
<div>Selected: {{ selectmodel }}</div> -->
57-
<!-- <div v-query-param:filter="filterstr">{{ typeof filter }}</div>
58-
<input type="number" v-model="filter" /> -->
59-
<!-- <div>
60-
<textarea v-model="search" v-query-param:textarea="search" placeholder="add multiple lines"></textarea>
61-
</div> -->
20+
</select>
6221
<div>
63-
<VueDatePicker v-query-param:datefrom="datestr" v-model="date"/>
22+
<VueDatePicker v-query-param:datefrom="{
23+
model: date,
24+
format: (val: Date) => val.toLocaleDateString(),
25+
callback: (val: string) => date = new Date(val)
26+
}" v-model="date"/>
6427
</div>
6528
</template>
6629

playground/DatePicker.vue

-22
This file was deleted.

src/components/v-query-param.ts

+13-11
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
import { getValueFromURL, setValueToURL } from "./history";
2-
32
import type { Binding, QueryParamArgs } from "../types";
43

5-
const defaultArgs = {
6-
model: "",
7-
callback: null,
8-
format: (val: object) => `${val}`,
9-
}
10-
114
function getArgs(el: HTMLElement, binding: Binding): QueryParamArgs {
12-
if (typeof binding.value === 'string') {
5+
const defaultArgs = {
6+
model: "",
7+
callback: null,
8+
format: (val: object) => val,
9+
}
10+
if (typeof binding.value !== 'object') {
1311
return Object.assign(defaultArgs, {model: binding.value})
1412
} else {
15-
return Object.assign({}, defaultArgs, binding.value)
13+
if ("model" in binding.value) {
14+
return Object.assign(defaultArgs, binding.value)
15+
} else {
16+
return Object.assign(defaultArgs, { model: binding.value })
17+
}
1618
}
1719
}
1820

@@ -25,8 +27,8 @@ const vQueryParam = {
2527
args.callback(getValueFromURL(binding.arg))
2628
}
2729
},
28-
updated(el: HTMLElement, binding: Binding) {
29-
const args = getArgs(el, binding)
30+
updated(el: HTMLElement, binding: Binding) {
31+
const args = getArgs(el, binding)
3032
setValueToURL(binding.arg, args.format(args.model))
3133
},
3234
mounted(el: HTMLElement, binding: Binding) {

src/types.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
1-
import { VueElement } from "vue"
2-
31
export interface QueryParamArgs {
42
model: string
53
callback: Function | null
64
format: Function
75
}
86

97
export interface Binding {
10-
value: Function | QueryParamArgs
11-
oldValue: Function | QueryParamArgs
8+
value: string | QueryParamArgs
9+
oldValue: string | QueryParamArgs
1210
arg: string
1311
modifiers: object
14-
instance: VueElement
12+
instance: object
1513
dir: object
1614
}

0 commit comments

Comments
 (0)