Vue 可以作为独立的脚本文件使用,无需构建步骤!如果你有一个后端框架,并且它已经渲染了大部分的 HTML,或者你的前端逻辑并不复杂,不需要构建步骤。
所以,Vue 也提供了另一个适用于此类无构建步骤场景的替代版 petite-vue,主要为渐进式增强已有的 HTML 作了特别的优化。功能更加精简,十分轻量。
自动初始化
petite-vue 无需构建流程即可使用。只需从 CDN 加载它:
<script src="https://unpkg.com/petite-vue" defer init></script>
<!-- 页面任意位置 -->
<div v-scope="{ count: 0 }">
{{ count }}
<button @click="count++">inc</button>
</div>
手动初始化
如果您不想要自动初始化,请删除该 init 属性并将脚本移动到 <body>
末尾:
<script src="https://unpkg.com/petite-vue"></script>
<script>
PetiteVue.createApp().mount()
</script>
或者,使用 ES 模块构建:
<script type="module"> import { createApp } from 'https://unpkg.com/petite-vue?module'
createApp().mount() </script>
该 createApp 函数接受一个对象参数,是所有表达式的根作用域。
<script type="module"> import { createApp } from 'https://unpkg.com/petite-vue?module'
createApp({
// exposed to all expressions
count: 0,
// getters
get plusOne() {
return this.count + 1
},
// methods
increment() {
this.count++
}
}).mount() </script>
<!-- v-scope value can be omitted -->
<div v-scope>
<p>{{ count }}</p>
<p>{{ plusOne }}</p>
<button @click="increment">increment</button>
</div>
注意 v-scope 这里不需要有值,只是作为 petite-vue 处理元素的提示。
您可以指定一个挂载目标(选择器或元素)petite-vue 以仅限于页面的该区域:
createApp().mount('#only-this-div')
这也意味着您可以拥有多个 petite-vue 应用程序来控制同一页面上的不同区域:
createApp({
// root scope for app one
}).mount('#app1')
createApp({
// root scope for app two
}).mount('#app2')
您可以监听每个元素的特殊事件 vue:mounted 和 vue:unmounted
<div
v-if="show"
@vue:mounted="console.log('mounted on: ', $el)"
@vue:unmounted="console.log('unmounted: ', $el)"
></div>
用 v-effect 执行响应式内联语句:
<div v-scope="{ count: 0 }">
<div v-effect="$el.textContent = count"></div>
<button @click="count++">++</button>
</div>
effect 响应式地追踪其依赖,并在依赖更改时重新执行,因此每当更改 count 时它都会重新运行。
“组件”的概念在 petite-vue 中有所不同,因为它更加简单。
首先,可以使用函数创建可复用部分的逻辑:
<script type="module"> import { createApp } from 'https://unpkg.com/petite-vue?module'
function Counter(props) {
return {
count: props.initialCount,
inc() {
this.count++
},
mounted() {
console.log(`I'm mounted!`)
}
}
}
createApp({
Counter
}).mount() </script>
<div v-scope="Counter({ initialCount: 1 })" @vue:mounted="mounted">
<p>{{ count }}</p>
<button @click="inc">increment</button>
</div>
<div v-scope="Counter({ initialCount: 2 })">
<p>{{ count }}</p>
<button @click="inc">increment</button>
</div>
带有模板的组件
如果您还想复用模板,您可以使用 $template
属性,该值可以是模板字符串,也可以是 <template>
元素的 ID 选择器:
<script type="module"> import { createApp } from 'https://unpkg.com/petite-vue?module'
function Counter(props) {
return {
$template: '#counter-template',
count: props.initialCount,
inc() {
this.count++
}
}
}
createApp({
Counter
}).mount() </script>
<template id="counter-template">
My count is {{ count }}
<button @click="inc">++</button>
</template>
<!-- reuse it -->
<div v-scope="Counter({ initialCount: 1 })"></div>
<div v-scope="Counter({ initialCount: 2 })"></div>
建议使用该 <template>
方法而不是内联字符串,因为从本地模板克隆元素更高效。
您可以使用该 reactive 方法来创建全局状态:
<script type="module"> import { createApp, reactive } from 'https://unpkg.com/petite-vue?module'
const store = reactive({
count: 0,
inc() {
this.count++
}
})
// manipulate it here
store.inc()
createApp({
// share it with app scopes
store
}).mount() </script>
<div v-scope="{ localCount: 0 }">
<p>Global {{ store.count }}</p>
<button @click="store.inc">increment</button>
<p>Local {{ localCount }}</p>
<button @click="localCount++">increment</button>
</div>
还支持自定义指令,但写法不同:
const myDirective = (ctx) => {
// the element the directive is on
ctx.el
// the raw value expression
// e.g. v-my-dir="x" then this would be "x"
ctx.exp
// v-my-dir:foo -> "foo"
ctx.arg
// v-my-dir.mod -> { mod: true }
ctx.modifiers
// evaluate the expression and get its value
ctx.get()
// evaluate arbitrary expression in current scope
ctx.get(`${ctx.exp} + 10`)
// run reactive effect
ctx.effect(() => {
// this will re-run every time the get() value changes
console.log(ctx.get())
})
return () => {
// cleanup if the element is unmounted
}
}
// register the directive
createApp().directive('my-dir', myDirective).mount()
petite-vue 仅有的特性
不同的功能
vue共用的特性
不支持的特性
一些特征被丢弃,因为它们在渐进增强的背景下具有相对较低的使用频率。如果你需要这些特性,你可能应该只使用标准的 Vue。
文章转自:https://blog.csdn.net/qq_53225741/article/details/125165417