Skip to content
On this page

useModel

helper to wrap model update into a ref

Parameters

typescript
import { useModel } from '@elonehoo/pistachio'

useModel(props, propName)
import { useModel } from '@elonehoo/pistachio'

useModel(props, propName)
ParametersTypeRequiredDescription
propsPropstrueProps object from the setup(props)
propNamestringtrueProp key, used to access property value

State

The useModel function exposes the following reactive state:

typescript
import { useModel } from '@elonehoo/pistachio'

const myValue = useModel(props, "myValue")
import { useModel } from '@elonehoo/pistachio'

const myValue = useModel(props, "myValue")
StateTypeDescription
myValueRef<T>Value for the prop

myValue: MyValue

vue
<!-- child.vue -->
<script setup lang="ts">
import { computed, getCurrentInstance, ref, } from 'vue'

</script>

<script setup lang="ts">
import child from './child.vue'

const props = defineProps(['value'])

function useModel(props: any, name: any) {
  const instance = getCurrentInstance()
  if (!instance)
    return ref()

  return computed({
    get() {
      return props[name]
    },
    set(v) {
      instance.emit(`update:${name}`, v)
    }
  })
}

const value = useModel(props, 'value')

const myValue = ref('MyValue')

</script>

<!-- index.vue -->
<template>
  <div>
    <label>Update value:</label>
    <input v-model="value" name="child-input">
  </div>
</template>

<template>
  <div>
    <p>myValue: {{ myValue }}</p>

    <child v-model:value="myValue"/>
  </div>
</template>
<!-- child.vue -->
<script setup lang="ts">
import { computed, getCurrentInstance, ref, } from 'vue'

</script>

<script setup lang="ts">
import child from './child.vue'

const props = defineProps(['value'])

function useModel(props: any, name: any) {
  const instance = getCurrentInstance()
  if (!instance)
    return ref()

  return computed({
    get() {
      return props[name]
    },
    set(v) {
      instance.emit(`update:${name}`, v)
    }
  })
}

const value = useModel(props, 'value')

const myValue = ref('MyValue')

</script>

<!-- index.vue -->
<template>
  <div>
    <label>Update value:</label>
    <input v-model="value" name="child-input">
  </div>
</template>

<template>
  <div>
    <p>myValue: {{ myValue }}</p>

    <child v-model:value="myValue"/>
  </div>
</template>

Released under the MIT License.