vue练习

<template>
  <div>
    <post-list :posts="posts" v-show="flag"></post-list>
    <button @click="deleteData">删除一条数据</button>
    <button @click="isShow">销毁列表组件</button>
  </div>
</template>

<script setup lang="ts">
import { ref, reactive } from "vue";
import PostList from "../views/PostList.vue";
import axios from "axios"

// 父组件通过子组件属性传值,绑定的属性可以看作是通信信号
const posts = ref([]);

const flag = ref(true)
const isShow = () => {
  flag.value = !flag.value
}

const deleteData = () => {
  posts.value.pop()
}

const data = axios.get("http://localhost:8888/posts")
.then((response) => {
  console.log("响应的数据",response)
  posts.value = response.data
})
.catch((error) => {
  console.log("请求异常",error)
})
.finally(() => {
  console.log("最后比执行")
})
</script>

<style scoped></style>
<template>
  <div>
    <p>博客列表</p>
    <div v-for="(post,index) in posts" :key="index">
    <single-post :post="post"></single-post>
    </div>
    
  </div>
</template>

<script setup lang="ts">
import SinglePost from "../views/SinglePost.vue"
import {ref,onMounted,onUnmounted,onUpdated} from "vue"
// 子组件定义属性,用于接收传值
defineProps({
  posts: Array,
});

// vue常用的生命钩子函数,onMounted,onUnmounted,onUpdated
// 在页面渲染之前执行
onMounted(() => {
  alert("当页面渲染前执行")
})

// 在页面不渲染前,也就是页面销毁前执行
onUnmounted(() => {
  alert("当页面销毁前执行")

})

// 在页面内容发生变化时执行
onUpdated(() => {
  alert("当页面内容发生变化时执行")
})
</script>

<style scoped></style>
<template>
  <div>
    <h3>{{ props.post.title }}</h3>
    <p>{{ data }}</p>
  </div>
</template>

<script setup lang="ts">
import { computed } from "vue";
// 在js的逻辑代码中,不能直接使用defineProps中定义的属性名,可以通过一个对象接受使用
const props = defineProps({
  post: Object,
});

const data = computed(() => {
  return props.post.body.substring(0,100) + "...";
});

</script>

<style scoped></style>

请求抽离:

import { ref } from "vue";
import axios from "axios";

const getPost = (id:number) => {
  // 父组件通过子组件属性传值,绑定的属性可以看作是通信信号
const post = ref({});

  // 在定义方法时,只需在方法前加async关键字就可以将该方法设置为异步方法
  // 通过const当以的名字必须唯一,且该名字不能指向另一个对象,但可以改变名字指向对象的值
  const loadData = async () => {
    let data = await axios.get("http://localhost:8888/posts/" + id);
    console.log("获取的数据:", data);
    post.value = data.data;
  };

  loadData();
  return { post, loadData };
};

export default getPost;

路由传参:

import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router";
import Home from "../views/Home.vue";
import About from "../components/About.vue";

const routes: Array<RouteRecordRaw> = [
  { path: "/", name: "index", component: Home },
  // 通过在路由中设置props: true,可以使得在跳转的目标路由中通过defineProps函数接收参数
  { path:"/about/:id", name: "about", component: About,props: true}
];

const router = createRouter({
  history: createWebHistory(),
  routes: routes,
});

export default router;
  <router-link :to="{name:'about',params:{id:props.post.id}}">
    <h3>{{ props.post.title }}</h3>
  </router-link>
<template>
  <div>
    <h2>About关于 -- {{id}}</h2>
    <h3>{{ post.title }}</h3>
    <p>{{ post.body }}</p>
    <div v-for="(item, index) in post.tags" :key="index">{{ item }}</div>
  </div>
</template>

<script setup lang="ts">
import getPost from "../api/about"
const props = defineProps({
  id: Number,
});

const {post} = getPost(props.id);
</script>
<style scoped></style>

也可以通过useRoute函数的对象来获取当前路由的参数

import {useRoute} from "vue-router"
const route = useRoute()
route.params.id

如果使用这种方式,就可以不用在路由上加 props:true来开启属性传值

总结:

在逻辑ts中实现路由跳转

import { useRouter } from "vue-router";
const router = useRouter();
router.push("/")
// 或者
router.push({ path: "/", name: "index", component: Home })

拿到当前组件的路由实例,同时获取其中的信息

import {useRoute} from "vue-router"
const route = useRoute()
route.params.id

 在template模板中实现路由跳转使用 router-link  并通过属性 to 指定跳转的目标路由

// 这种可以传参数
<router-link :to="{name:'about',params:{id:props.post.id}}">
   <h3>{{ props.post.title }}</h3>
</router-link>
{ path: "/about/:id", name: "about", component: About},
// 或者
<router-link to="/">首页</router-link>
<router-link to="/create">新建</router-link>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值