
标题 | 详情 |
|---|---|
作者简介 | 愚公搬代码 |
头衔 | 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。 |
近期荣誉 | 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。 |
博客内容 | .NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。 |
欢迎 | 👍点赞、✍评论、⭐收藏 |
在学习任何一项技术时,理论与实践相结合是掌握知识的最佳方式。Vue.js 作为一款功能强大的前端框架,其组件的属性和方法为开发者提供了丰富的功能和灵活性。在前面的学习中,我们深入探讨了 Vue 组件的多种特性,包括数据绑定、事件处理、样式绑定等,这些都是构建高效应用的基础。
本文将对之前的内容进行小结,帮助大家理清 Vue 组件的核心概念,并巩固所学知识。同时,我们还将通过实际的上机演练,带领大家动手实践,加深对 Vue 组件属性和方法的理解。通过一系列的练习,我们希望能够提升大家的实际操作能力,让你在真实项目中游刃有余。
在 Vue.js 3.x 中,计算属性(computed properties)和普通属性(data properties)都有各自的用途和特点。以下是它们之间的主要区别和用法:
普通属性是存储在组件实例中的响应式数据。它们通常在 data 选项或 setup 函数中定义。当这些数据发生变化时,依赖这些数据的模板会自动更新。
定义和使用方式:
在 Vue 2.x 中:
new Vue({
data: {
message: 'Hello World'
}
});在 Vue 3.x 中使用 setup 函数:
const { ref } = Vue;
const App = {
setup() {
const message = ref('Hello World');
return { message };
}
};特点:
计算属性是基于响应式数据的值计算出来的属性。它们通常用于对数据进行派生计算,并且具有缓存功能:只有当依赖的数据发生变化时,计算属性的值才会重新计算。
定义和使用方式:
在 Vue 2.x 中:
new Vue({
data: {
number: 1
},
computed: {
doubleNumber() {
return this.number * 2;
}
}
});在 Vue 3.x 中使用 setup 函数和 computed 方法:
const { ref, computed } = Vue;
const App = {
setup() {
const number = ref(1);
const doubleNumber = computed(() => number.value * 2);
return { number, doubleNumber };
}
};特点:
以下是一个完整的 Vue 3.x 示例,展示了普通属性和计算属性的使用:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue Example</title>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
<p>Number: {{ number }}</p>
<p>Double Number: {{ doubleNumber }}</p>
<button @click="number++">Increment</button>
</div>
<script>
const { createApp, ref, computed } = Vue;
const App = {
setup() {
const number = ref(1);
const doubleNumber = computed(() => number.value * 2);
return {
number,
doubleNumber
};
}
};
createApp(App).mount('#app');
</script>
</body>
</html>在这个例子中:
number 是一个普通属性,用于存储当前的数字。doubleNumber 是一个计算属性,始终是 number 的两倍,并且只在 number 改变时重新计算。属性侦听器(Watchers or Watch Properties)在 Vue.js 中用于观察和响应数据的变化。它们允许开发者在数据发生变化时执行自定义逻辑,是处理复杂数据变动场景的一种工具。
以下是一个在 Vue.js 3.x 中使用属性侦听器的例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue Watch Example</title>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
<input v-model="searchQuery" placeholder="Type to search...">
<p>Search Results: {{ searchResults }}</p>
</div>
<script>
const { createApp, ref, watch } = Vue;
const App = {
setup() {
const searchQuery = ref('');
const searchResults = ref('');
// 模拟一个异步搜索函数
function fetchSearchResults(query) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(`Results for: ${query}`);
}, 500); // 模拟网络延迟
});
}
// 监听 searchQuery 的变化
watch(searchQuery, async (newQuery) => {
if (newQuery) {
searchResults.value = 'Loading...';
searchResults.value = await fetchSearchResults(newQuery);
} else {
searchResults.value = '';
}
});
return {
searchQuery,
searchResults
};
}
};
createApp(App).mount('#app');
</script>
</body>
</html>解释
searchQuery 是一个响应式变量,绑定到输入框。searchResults 用于显示搜索结果。watch 函数监听 searchQuery 的变化。searchQuery 改变时,首先将 searchResults 设置为 "Loading...",然后调用 fetchSearchResults 模拟一个异步搜索操作,最后将结果更新到 searchResults。watch 选项的详细用法
在 Vue 3.x 中,除了使用 setup 函数中的 watch 方法,还可以在组件选项中使用 watch 选项来定义侦听器。这在 Vue 2.x 和 3.x 中都有类似的用法。
const App = {
data() {
return {
searchQuery: '',
searchResults: ''
};
},
watch: {
async searchQuery(newQuery) {
if (newQuery) {
this.searchResults = 'Loading...';
this.searchResults = await fetchSearchResults(newQuery);
} else {
this.searchResults = '';
}
}
}
};watch 函数的选项
watch 函数可以接收第三个参数,用于配置一些选项,比如 immediate 和 deep。
watch(searchQuery, (newQuery) => {
// 处理逻辑
}, { immediate: true, deep: true });任务需求整理
参考练习步骤
<div> 元素,id 属性设置为 app,作为 Vue 应用的挂载点。<script> 标签内,创建一个 Vue 实例,并定义 message 变量。MyComponent 的 Vue 组件,并在其中定义两个按钮。MyComponent 组件中,定义两个方法 button1Clicked 和 button2Clicked,用于处理按钮单击事件。<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue Component Attributes and Methods</title>
<!-- 引入Vue库 -->
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<!-- 创建 Vue 应用的挂载点 -->
<div id="app">
<!-- 使用Vue组件 -->
<my-component></my-component>
</div>
<script>
const { createApp, ref } = Vue;
// 定义主应用
const App = {};
// 创建 MyComponent 组件
const MyComponent = {
template: `
<div>
<button @click="button1Clicked">Button 1</button>
<button @click="button2Clicked">Button 2</button>
<p>{{ message }}</p>
</div>
`,
setup(props, { emit }) {
const message = ref('');
const button1Clicked = () => {
message.value = 'Button 1 clicked!';
};
const button2Clicked = () => {
message.value = 'Button 2 clicked!';
};
return {
message,
button1Clicked,
button2Clicked
};
}
};
// 创建并挂载 Vue 实例到 DOM 元素上
createApp(App).component('my-component', MyComponent).mount('#app');
</script>
</body>
</html>解析:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue Component Attributes and Methods</title>
<!-- 引入Vue库 -->
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body><!DOCTYPE html>: 定义文档类型为 HTML5。<html lang="en">: 定义 HTML 文档的语言为英语。<head> 部分包含了文档的元数据,例如字符编码和视口设置。<meta charset="UTF-8">: 设置文档的字符编码为 UTF-8。<meta name="viewport" content="width=device-width, initial-scale=1.0">: 设置视口,使页面在各种设备上显示良好。<title>: 设置页面标题。<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>: 引入 Vue 3 库。<div id="app">
<!-- 使用Vue组件 -->
<my-component></my-component>
</div><div id="app">: 定义一个挂载 Vue 应用的 DOM 元素。<my-component></my-component>: 使用自定义的 Vue 组件 my-component。<script>
const { createApp, ref } = Vue;
// 定义主应用
const App = {};
// 创建 MyComponent 组件
const MyComponent = {
template: `
<div>
<button @click="button1Clicked">Button 1</button>
<button @click="button2Clicked">Button 2</button>
<p>{{ message }}</p>
</div>
`,
setup(props, { emit }) {
const message = ref('');
const button1Clicked = () => {
message.value = 'Button 1 clicked!';
};
const button2Clicked = () => {
message.value = 'Button 2 clicked!';
};
return {
message,
button1Clicked,
button2Clicked
};
}
};
// 创建并挂载 Vue 实例到 DOM 元素上
createApp(App).component('my-component', MyComponent).mount('#app');
</script>const { createApp, ref } = Vue;: 从 Vue 库中解构出 createApp 和 ref 方法。const App = {};: 定义一个空的主应用对象。const MyComponent = { ... }: 定义一个名为 MyComponent 的组件。template: 定义组件的模板,其中包含两个按钮和一个显示消息的段落 <p>。setup(props, { emit }): Vue 3 的组合式 API,定义组件的逻辑。const message = ref('');: 创建一个响应式引用 message,初始值为空。const button1Clicked = () => { ... }: 定义 button1Clicked 方法,点击时会更新 message 的值。const button2Clicked = () => { ... }: 定义 button2Clicked 方法,点击时会更新 message 的值。return { ... }: 返回组件模板中使用的数据和方法。createApp(App).component('my-component', MyComponent).mount('#app');: 创建一个 Vue 应用实例,注册 MyComponent 组件,并挂载到 #app 元素上。这样,这段代码创建了一个简单的 Vue 应用,包含一个自定义组件 my-component,该组件包含两个按钮和一个显示点击信息的段落。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。