安装 json-server
npm install -g json-server
json-server -v
json-server --watch data/db.json
{
"posts":[
{
"title":"zt.js",
"body":"db本课程",
"id":1,
"tags":[
"vue3",
"compositionApi",
"blog"
]
},
{
"title":"zt.js",
"body":"db本课程",
"id":2,
"tags":[
"vue3",
"compositionApi",
"blog"
]
},
{
"title":"zt.js",
"body":"db本课程",
"id":3,
"tags":[
"vue3",
"compositionApi",
"blog"
]
}
]
}
import { ref } from "vue";
import axios from 'axios'
const getPosts=()=>{
const posts = ref([]);
const load=async()=>{
try{
let { data } =await axios("http://localhost:3000/posts")
posts.value=data
}catch(error){
console.log(error)
}
}
return {posts,load}
}
export default getPosts
<script setup>
import PostList from "../components/PostList.vue";
import getPosts from '../composibles/getPosts'
const {posts,load}=getPosts()
load();
</script>
<template>
<div class="home">
<div v-if="posts.length"><PostList :posts="posts" /></div>
<div v-else>加载中....</div>
</div>
</template>
<script setup>
import {computed } from "vue";
const props=defineProps({
post:Object
});
const snippet= computed(
()=>{
return props.post.body.substring(0,10)+"...";
}
)
</script>
<template>
<div class="post">
<h3>{{post.title}}</h3>
<p>{{snippet}}</p>
<span v-for="tag in post.tags" :key="tag">#{{tag}}</span>
</div>
</template>
<style>
.post {
margin: 0 40px 30px;
padding-bottom: 30px;
border-bottom: 1px dashed #e7e7e7;
}
.post h3{
display: inline-block;
position: relative;
font-size: 26px;
color: black;
margin-bottom: 10px;
max-width: 400px;
}
.post h3::before{
content: "";
display: block;
width: 100%;
height: 100%;
background-color: #ff8800;
position: absolute;
z-index: -1;
padding-right: 40px;
left: -30px;
}
</style>
安装 axios 安装router
npm install vue-router
npm i axios
定义router / router.js
import { createRouter,createWebHistory } from "vue-router";
import Home from '../views/Home.vue'
import Details from '../views/Details.vue'
const routes=[
{path:"/",name:'Home',component:Home},
{path:"/posts/:id",name:'Details',component:Details,props:true}
]
const router =createRouter(
{
history:createWebHistory(),
routes
}
)
export default router
获取详情 接口数据模拟
import { ref } from "vue";
import axios from 'axios'
const getPost=(id)=>{
const post = ref({});
const load=async()=>{
try{
let { data } =await axios("http://localhost:3000/posts/"+id)
post.value=data
}catch(error){
console.log(error)
}
}
return {post,load}
}
export default getPost
配置 点击进去详情页
SinglePost.vue
<router-link :to="{name:'Details',params:{id:post.id}}">
<h3>{{post.title}}</h3>
</router-link>
router/index.js
{path:"/posts/:id",name:'Details',component:Details,props:true}
views/Detail.vue
<script setup>
import getPost from '../composibles/getPost'
const porps=defineProps({
id:Number,
});
const {post,load}=getPost(porps.id)
load()
</script>
<template>
<div>Details{{post.title}}</div>
</template>
<style>
</style>