unref
Read one ref layer, or return a non-ref value unchanged.
unrefReactivity
Read one ref layer, or return a non-ref value unchanged.
Overview
The unref function allows you to safely retrieve the original value from a ref object if the given value is a ref, or it simply returns the value itself if it's not a ref.
Try it live
Compare deep, copied, and shallow stateLive API
Nested properties are refs.
Original still says Ada.
Replace the plain object to notify.
- isRef(deep) / isDeepRef(deep)
- true / true
- isDeepRef(shallow) / unref(name)
- false / Ada
{
"profile": {
"name": "Ada"
}
} import {
computed,
cref,
flatten,
html,
isDeepRef,
isRef,
ref,
sref,
unref,
} from 'regor'
export function createState(interactive = false) {
const original = { profile: { name: 'Ada' } }
const deep = ref({ profile: { name: 'Ada' } })
const copied = cref(original)
const shallow = sref({ profile: { name: 'Ada' } })
const name = ref('Grace')
const apply = () => {
deep().profile().name(name())
copied().profile().name(name())
shallow({ profile: { name: name() } })
}
return {
interactive,
name,
deep,
copied,
shallow,
apply,
originalName: original.profile.name,
snapshot: computed(() => JSON.stringify(flatten(deep()), null, 2)),
refCheck: isRef(deep),
deepCheck: isDeepRef(deep),
shallowCheck: isDeepRef(shallow),
plainName: computed(() => unref(deep().profile().name)),
}
}
export const stateTemplate = html` <div class="guide-demo">
<div class="guide-filter">
<label
>New name<input
type="text"
maxlength="30"
r-model="name"
:value="name"
:disabled="!interactive" /></label
><button type="button" @click="apply" :disabled="!interactive">
Apply to all three
</button>
</div>
<div class="api-comparison">
<article class="directive-card">
<span class="guide-kicker">REF / DEEP</span
><strong>{{ deep.profile.name }}</strong>
<p>Nested properties are refs.</p>
</article>
<article class="directive-card">
<span class="guide-kicker">CREF / COPY FIRST</span
><strong>{{ copied.profile.name }}</strong>
<p>Original still says {{ originalName }}.</p>
</article>
<article class="directive-card">
<span class="guide-kicker">SREF / SHALLOW</span
><strong>{{ shallow.profile.name }}</strong>
<p>Replace the plain object to notify.</p>
</article>
</div>
<dl class="directive-values">
<div>
<dt>isRef(deep) / isDeepRef(deep)</dt>
<dd>{{ refCheck }} / {{ deepCheck }}</dd>
</div>
<div>
<dt>isDeepRef(shallow) / unref(name)</dt>
<dd>{{ shallowCheck }} / {{ plainName }}</dd>
</div>
</dl>
<pre class="api-snapshot" r-text="snapshot"></pre>
</div>` import { createApp, RegorConfig, useScope } from 'regor'
import { apiExamples } from './examples'
const element = document.getElementById('api-demo')
const name = element?.dataset.example
if (element && name && Object.hasOwn(apiExamples, name)) {
const example = apiExamples[name as keyof typeof apiExamples]
const scope = useScope<object>(() => example.create(true))
const config =
'config' in scope.context && scope.context.config instanceof RegorConfig
? scope.context.config
: undefined
createApp(scope, { element, template: example.template }, config)
} Change the name and apply it. Inspect the nested values, ref checks, and flattened snapshot.
Usage
Unwrapping a Ref
To safely retrieve the original value from a ref or non-ref value, you can use the unref function.
import { unref } from 'regor'
const myValue = /* Your ref or non-ref value here */
const unwrappedValue = unref(myValue) Parameters
value: The value you want to unwrap. It can be a ref object or a non-ref value.
Return Value
- The
unreffunction returns the original value if the providedvalueis a ref. Ifvalueis not a ref, it returns the samevalueitself.
Example
import { ref, unref } from 'regor'
const myRef = ref('Hello, Regor!')
// Unwrapping a ref value
const unwrappedValue = unref(myRef)
console.log(unwrappedValue) // Outputs 'Hello, Regor!'
const nonRefValue = 'This is not a ref.'
// Unwrapping a non-ref value (no change)
const sameValue = unref(nonRefValue)
console.log(sameValue) // Outputs 'This is not a ref.' Unwrap one layer deliberately
unref is useful for a value-or-ref input. Use flatten when you need to unwrap a whole nested structure.