美食杰-详情

本文档详细介绍了使用Vue.js实现菜品详情页的数据渲染,包括从后端获取菜谱信息并传递给子组件,以及实现评论功能。涉及到的数据监听、组件通信、状态管理(Vuex)、异步请求、条件渲染和事件处理等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天主要实现菜品详情页的数据渲染和评论

 评论可以提交

1.在data里面定义一个存储从后端接收的数据

data(){
    return {
      menuInfo:[]//接收菜谱的详细信息
    }
  },

 2.watch监听,如果有参数就将从后端获取的数据赋值给data里面定义的数组,如果没有参数就警告用户重新进入页面,把后端中的方法用import引入。

watch:{
    $route:{
      handler(){
        //获取参数
        let {menuId} = this.$route.query;
        if(menuId){//发布请求
            menuInfo({menuId}).then(({data})=>{
              //将请求到的数据赋值给data里面定义的数组
              this.menuInfo=data.info;
              console.log(this.menuInfo);
            })
        }else{
          // 如果没有参数,就警示用户
          this.$message({
            showClose:true,
            message:'请重新进入',
            type:'warning'
          })
        }
      },
      // 初始化监听
      immediate:true
    }
  }

3.在标签中将数据传给子组件

<div class="menu-detail">
    <!-- 向子组件传参 -->
    <detail-header :info="menuInfo"></detail-header>
    <detail-content :info="menuInfo"></detail-content>
    <Comment :info="menuInfo"></Comment>
  </div>

4.在子组件中用props接收数据

props:{
    info: {
      type: Object,
      default: () => ({})
    }
  },

5.渲染数据(笔者在此不做展示)

6.“收藏”和“已收藏”切换。

<a 
  href="javascript:;" 
  class="collection-at"
  :class="{'no-collection-at':info.isCollection}"
  @click="collectHandler"
> 
     {{info.isCollection?'已收藏':'收藏'}}
</a>

isCollection是他的状态,初始为false,在info数据里面

写入点击事件

methods:{
   async collectHandler(){
      const {data} = await toggleCollection({menuId:this.info.menuId})
      console.log(data);
      this.info.isCollection = data.isCollection;
    }
  }

7.如果用户进的是自己发布的作品,就隐藏收藏按钮

computed: {
    isOnwer(){
      return this.info.userInfo.userId === this.$store.state.userInfo.userId
    }
  },

 在收藏的父标签上绑定isOnwer

<div class="detail-collection" v-if="!isOnwer">
<a 
  href="javascript:;" 
  class="collection-at"
  :class="{'no-collection-at':info.isCollection}"
  @click="collectHandler"
> 
     {{info.isCollection?'已收藏':'收藏'}}
</a>
</div>

8.评论

在data中定义存储数据的数组

data(){
    return {
      comments:[],//接收数据
      commentText:""//评论内容
    }
  },

9.接收后端的数据

computed: {
    // 后端数据
    userInfo(){
      return this.$store.state.userInfo
    },
    // 登录状态
    isLogin(){
      return this.$store.getters.isLogin
    }
  },

10.从后端获取评论的数据

async mounted(){
    // 获取评论的信息
    let {menuId} = this.$route.query;
    if(menuId){
      let data=await getComments({menuId:menuId})
      this.comments = data.data.comments
    }
  }

11.点击事件

methods:{
    // 提交评论方法
    async send(){
    //通过后端方法传参
      let data = await postComment({menuId:this.info.menuId,commentText:this.commentText});
      // console.log(data);
        //将提交的内容添加到data中定义的数组
      this.comments.unshift(data.data.comments);
        //当用户提交后,清空文本框里的内容
      this.commentText="";
    }
  },

欧了。冲冲冲!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值