自动初始化
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> 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 directivecreateApp().directive('my-dir', myDirective).mount()
petite-vue 仅有的特性
不同的行为
vue 共用的特性
一些特征被丢弃,因为它们在渐进增强的背景下具有相对较低的使用频率。如果你需要这些特性,你可能应该只使用标准的 Vue。