3đ
Accessing _
in template
Assuming youâre using the Options API, importing _
does not automatically make it available to the template (as @tao pointed out in his answer). The template can only access fields exposed via the component options (e.g., data
, props
, methods
, computed
, etc.) in addition to a few allow-listed globals (Vue 2 allowed globals, Vue 3 allowed globals).
Using _.debounce
_.debounce
âs first argument is a function reference:
_.debounce(submit(props.row, props.index), 100) // â calls `submit()`, and passes the result to _.debounce()
To create a debounced submit
, pass the submit
-reference as an argument to _.debounce
like this:
_.debounce(submit, 100)
You technically could invoke the debounced function immediately:
_.debounce(submit, 100)(props.row, props.index)
âŠbut donât do that in the template (see reason below).
Using a debounced event handler for v-on
When the value of the v-on
directive (@
for shorthand) is an expression (as in your case), the template compiler automatically wraps the expression in a function, so this:
@change="_.debounce(submit, 100)"
âŠessentially becomes:
@change="($event) => _.debounce(submit, 100)"
âŠwhich would have no effect, since debounce
doesnât invoke the wrapped function itself.
You might be tempted to call the function immmediately in:
@change="_.debounce(submit, 100)(props.row, props.index)"
âŠbut that creates a new debounced function on every event, which defeats the debouncing.
Solution
Create a debounced function in the <script>
part of the SFC that could then be used as the v-on
value:
Options API:
<script>
import { debounce } from 'lodash'
export default {
created() {
this.debouncedSubmit = debounce(this.submit, 100)
},
methods: {
submit(row, index) {/*...*/}
}
}
</script>
Composition API in setup()
option:
<script>
import { debounce } from 'lodash'
export default {
setup() {
const submit = (row, index) => {/*...*/}
return {
debouncedSubmit: debounce(submit, 100),
}
}
}
</script>
Composition API in <script setup>
:
<script setup>
import { debounce } from 'lodash'
const submit = (row, index) => {/*...*/}
const debouncedSubmit = debounce(submit, 100)
</script>
Template:
<cost-code-field @change="debouncedSubmit(props.row, props.index)" />
1đ
Any var referenced in template is prefixed with this
under the hood. Which means you canât reference global vars in the template, unless theyâre expressly declared in its context.
Simply put, the template context is an object. If you donât define a particular key and donât assign it a particular value, itâs going to be undefined
.
Probably the most concise way of exposing globals to the template is using computed
:
// ...
computed: {
_: () => _
}
// ...
In Composition API, the simplest way to expose globals is to add them in the object returned by setup
:
export default {
// ...
setup() {
//...
return {
_,
//...
}
}
}