生活中的比喻,通俗易懂
假设你刚刚搬进了一个新家(即你的vue组件已经被挂载到页面上)。在搬进新家后,有些事情需要在你真值开始使用这个新家之前做好,比如:
1.查看新家: 你可能需要检查新家的每个房间,看看哪里需要调整或装饰。这就像是你需要在组件挂载之后做一些初始化工作,以确保一切正常。
2.设置家用设备:在新家里,你可能需要设置电视,网络,灯光等设备,确保它们都能正常工作。这就类似于在组件挂载后,进行一些DOM操作或网络请求来初始化组件的状态。
onMounted的作用
搬家完成后的检查: onMounted 就像是在你搬家完成后,进行的第一次全面检查。它会在组件已经被添加到页面上后执行。你可以在这里做一些必须在页面上元素存在后才能完成的操作,比如获取DOM元素的尺寸,发送网络请求等。
例子:你需要在新家中安装窗帘(需要先有窗户才能安装),在你的组件挂载后,你可能需要检查页面上的某些元素(比如查看组件的尺寸),然后根据这些信息来调整布局或进行其他操作。
<template>
<div id="app">
<ul>
<li v-for="(item, index) in list" :key="item.id" class="news">
<div class="left">
<div class="title">{{ item.title }}</div>
<div class="info">
<span>{{ item.source }}</span>
<span>{{ item.time }}</span>
</div>
</div>
<div class="right">
<img :src="item.img" alt="">
</div>
</li>
</ul>
</div>
</template>
<script setup>
import { ref,onMounted } from 'vue';
import axios from 'axios';
// 创建响应式数据
const list = ref([]);
const word = ref('');
onMounted(async() => {
const res = await axios.get('http://hmajax.itheima.net/api/news');
list.value = res.data.data;
})
</script>
<style lang="scss" scoped>
* {
margin: 0;
padding: 0;
list-style: none;
}
.news {
display: flex;
height: 120px;
width: 600px;
margin: 0 auto;
padding: 20px 0;
cursor: pointer;
}
.news .left {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
padding-right: 10px;
}
.news .left .title {
font-size: 20px;
}
.news .left .info {
color: #999999;
}
.news .left .info span {
margin-right: 20px;
}
.news .right {
width: 160px;
height: 120px;
}
.news .right img {
width: 100%;
height: 100%;
object-fit: cover;
}
</style>
vue2中created作用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
list-style: none;
}
.news {
display: flex;
height: 120px;
width: 600px;
margin: 0 auto;
padding: 20px 0;
cursor: pointer;
}
.news .left {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
padding-right: 10px;
}
.news .left .title {
font-size: 20px;
}
.news .left .info {
color: #999999;
}
.news .left .info span {
margin-right: 20px;
}
.news .right {
width: 160px;
height: 120px;
}
.news .right img {
width: 100%;
height: 100%;
object-fit: cover;
}
</style>
</head>
<body>
<div id="app">
<ul>
<li v-for="(item, index) in list" :key="item.id" class="news">
<div class="left">
<div class="title">{{ item.title }}</div>
<div class="info">
<span>{{ item.source }}</span>
<span>{{ item.time }}</span>
</div>
</div>
<div class="right">
<img :src="item.img" alt="">
</div>
</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
list: [],
word: ''
},
// 一进页面就有
async created() {
const res = await axios.get('http://hmajax.itheima.net/api/news')
console.log(res);
// 更新到list中,用于页面渲染v-for
this.list = res.data.data
}
})
</script>
效果图