这篇文章记录了Vue中的常用方法,以Vue3为例。
npm init vue@latest
# 启用 ESlint 和 Prettier
cd project
# 安装依赖
npm install
npm install yarn@latest
yarn dev
const blog = ref({
title: "hawcat's Blog",
content: '描述内容',
link: '/hawcat',
})
在HTML标签中使用:*
进行动态绑定。
{{}}
用于展示Vue数据。
<a :href="blog.link"> {{ blog.title }} </a>
<footer v-if="blog.content.length > 100">
<button>阅读更多</button>
</footer>
:key
用于优化遍历速度。
<div v-for="blog in blogs" :key="blog.id">
<h1>
<a :href="blog.link"> {{ blog.title }} </a>
</h1>
<article>
<div>
{{ blog.content.slice(0, 100) }}
</div>
<footer v-if="blog.content.length > 100">
<button>阅读更多</button>
</footer>
</article>
</div>
computed
是Vue中的响应式API,用于根据其他响应式数据创建计算属性。当依赖的数据发生变化时,自动重新计算并缓存结果,直到相关依赖项变化。
const total_blogs = computed(() => blogs.value.length)
在HTML标签中,使用@
来跟踪事件。
const xx = ref()
和const xx = x
的区别在于,ref
定义的常量返回一个响应式对象,Vue会追踪它的.value
,而const
定义的是普通常量,不会被追踪。
const initialBlogForm = {
title: '',
content: '',
link: '',
}
const blogForm = ref({ ...initialBlogForm })
ref(...)
:使对象变为响应式,这样模板中的数据会随着值的变化而更新。
{ ...initialBlogForm }
:确保使用的是initialBlogForm
的副本,而不是直接与它绑定。
实现属性的双向绑定。
<input type="text" id="blogTitle" v-model="blogForm.title"></input>
在@事件
后添加修饰符来修改事件行为。
例如:<form @submit.prevent="">
prevent
修饰符阻止表单的默认提交行为,避免页面刷新。
解耦主页面,使用defineProps
定义组件接收的参数,类似于C++或Python方法的入参。
<template>
<div>
<h1>
<a :href="link"> {{ title }} </a>
</h1>
<article>
<div>
{{ content.slice(0, 100) }}
</div>
<footer v-if="content.length > 100">
<button>阅读更多</button>
</footer>
</article>
</div>
</template>
<script setup>
defineProps(['title', 'content', 'link'])
</script>
在父组件中使用:
<BlogPost v-for="blog in blogs" :key="blog.id" :title="blog.title" :content="blog.content" :link="blog.link"></BlogPost>
或者:
<BlogPost v-for="blog in blogs" :key="blog.id" v-bind="blog"></BlogPost>
使用onMounted()
方法在组件挂载后加载数据。
onMounted(() => {
setTimeout(() => {
viewCount.value = 10000
}, 1000)
})
类似于Qt中的信号系统,Vue允许自定义信号并通过事件传递数据。
例如,定义一个titleClick
信号,并在点击标题时触发该信号,传递title
参数。
<a :href="link" @click.prevent="$emit('titleClick', title)"> {{ title }} </a>
<!-- 在 setup 中 -->
defineEmits(['titleClick'])
在父组件中处理信号:
<BlogPost @titleClick="handleTitleClick" v-for="blog in blogs" :key="blog.id" v-bind="blog">
<button>分享到微信</button>
</BlogPost>
function handleTitleClick(title) {
console.log('点击了标题', title)
}