A custom Vue 3 directive that makes two-way binding Pure UI components easier.
Instructions for Vue 2 users
If you're looking for a directive that's compatible with Vue 2, install version 1.0.1 of this package:
npm install pure-v-model@1.0.1Then follow these instructions instead.
Install the directive with this command.
npm install pure-v-modelNext, import the directive into your app and enable it like this.
import "pure-uikit/dist/themes/light.css"
import "pure-uikit/dist/components/input/input"
import PureUIModelDirective from 'pure-v-model'
import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)
app.use(PureUIModelDirective)
app.config.compilerOptions.isCustomElement = tag => tag.startsWith('p-')
// If using Vite, the above "isCustomElement" needs to be deleted and defined in vite.config.js
// See below for an example vite.config.js
app.mount('#app')Now you can use the v-p-model directive to keep your data in sync!
<p-input v-p-model="name"></p-input>Currently, there's no support for v-model on custom elements in Vue. You can handle two-way binding manually, but's it rather verbose.
<!-- This doesn't work -->
<p-input v-model="name"></p-input>
<!-- This works, but it's a bit longer -->
<p-input :value="name" @input="name = $event.target.value"></p-input>This utility solves this problem by creating a custom directive that works just like v-model but for Pure UI components.
// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
vue({
template: {
compilerOptions: {
isCustomElement: (tag) => tag.startsWith('p-')
}
},
})
]
})