最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Product Detail page not routing in vue js - Stack Overflow

programmeradmin0浏览0评论

I have a product list page and productdetails page. When I click on the card of the product,it should go to that product detail page with the ID passed, but it doesnt happen.

I have two console.log. One for function viewDetails actually being called. I can see it is called as the log shows. Another log is in the product detail vue. Its in the lifecycle hook of created. But i dont see the log appear in the dev tools.

ProductList.vue

<template>           
  <div id="app">
    <!-- Navbar -->
    <nav class="navbar navbar-light bg-light">
      <div class="container-fluid">
        <a class="navbar-brand" href="#">Intellishop</a>        
      </div>

    </nav>

    <!-- Main Content -->
    
    <div class="container mt-4">
      <h1 class="text-center">Our Products</h1>
      <div class="row">
        <div v-for="product in products" :key="product.id" class="col-lg-3 col-md-4 col-sm-6 mb-4">
          <div class="card" @click="viewDetails(product.id)">
            <img :src="product.image" class="card-img-top product-image" alt="Product Image">
            <div class="card-body">
              <h5 class="card-title">{{ product.item_name }}</h5>
              <p class="card-text">Price: ${{ product.new_price }}</p>
              <p class="card-text">Discount: {{ product.discount }}%</p>
              <p>Seller: {{ product.seller }}</p>
            </div>
          </div>
        </div>
      </div>
    </div>  
      <!-- Pagination Controls -->
      <div class="pagination-container text-center mt-4">
        <button 
          class="btn btn-primary mx-1"
          :disabled="currentPage === 1"
          @click="fetchProducts(currentPage - 1)"
        >
          Previous
        </button>
        
        <span v-for="page in totalPages" :key="page">
          <button 
            class="btn btn-secondary mx-1"
            :class="{ 'btn-primary': page === currentPage }"
            @click="fetchProducts(page)"
          >
            {{ page }}
          </button>
        </span>
        
        <button 
          class="btn btn-primary mx-1"
          :disabled="currentPage === totalPages"
          @click="fetchProducts(currentPage + 1)"
        >
          Next
        </button>
      </div>
    </div>
  
</template>

<script>
import axios from 'axios';
// import LoginModal from "./LoginModal.vue";
// import LoginModal from "./Navbar.vue";
// import Navbar from './Navbar.vue';

export default {
  

  data() {
    return {
      products: [],
      currentPage: 1,
      pageSize: 8,
      totalPages: 0,
    };
  },
  created() {
    this.fetchProducts();
    console.log("i am being called")
  },
  methods: {
    async fetchProducts(page = 1) {
      try {
        const response = await axios.get(`http://127.0.0.1:8000/api/products?page=${page}`);
        this.products = response.data.results || [];
        console.log(this.products)
        this.totalPages = Math.ceil(response.data.count / this.pageSize);
        this.currentPage = page;
      } catch (error) {
        console.error("There was an error fetching the products!", error);
      }
    },
    navigateToLogin() {
      // Replace with your actual login route
      this.$router.push('/login');
    },
    viewDetails(productId) {
      console.log("Navigating to:", `/product/${productId}`);  // Debugging log
      this.$router.push(`/product/${productId}`).catch(err => {
      if (err.name !== "NavigationDuplicated") console.error(err);
      });
    }, 
  }
};

</script>

My index.js inside router folder

import Vue from 'vue';
import VueRouter from 'vue-router';
import ProductDetails from '../components/ProductDetails.vue';

// import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';


Vue.use(VueRouter);

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home,
  },
  { path: '/product/:id', component: ProductDetails },
];

// const router = createRouter({
//   history: createWebHistory(process.env.BASE_URL),
//   routes,
// });

const router = new VueRouter({
  mode: 'history', // Correct for Vue Router v3
  routes,
});


export default router;

My ProductDetails.vue

<template>
    <div>
      <h1>Product Details</h1>
      <p><strong>Name:</strong> {{ product.item_name }}</p>
      <p><strong>Price:</strong> ${{ product.new_price }}</p>
      <p><strong>Discount:</strong> {{ product.discount }}%</p>
      <p><strong>Seller:</strong> {{ product.seller }}</p>
      <img :src="product.image" alt="Product Image" />
    </div>
  </template>
  
  <script>
  export default {
  data() {
    return {
      product: null, // Start with no product
    };
  },
  created() {
    console.log("ProductDetails component created.");
    this.fetchProductDetails();
  },
  methods: {
    async fetchProductDetails() {
      const productId = this.$route.params.id; // Get ID from the route
      console.log(productId)
      try {
        const response = await axios.get(`http://127.0.0.1:8000/api/products/${productId}`);
        this.product = response.data;
      } catch (error) {
        console.error("Error fetching product details:", error);
      }
    },
  },
};
</script>

What is the problem here?

发布评论

评论列表(0)

  1. 暂无评论