1

I'm trying vueJS (+ laravel) and i'm encountering a problem.

I made an OrdersComponent.vue with a v-for (for each order which I retrieved from my API), but nothing happens

OrderComponent.vue : (h1 is rendering, and console.log(this.orders) is working)

   <template>
    <div>
        <h1> Commandes </h1>
        <div class="card card-body" v-for="order in orders" v-bind:key="order.idCommande">
            <h2> {{ order.date }} </h2>
            <span> {{ order.statut }} </span>
        </div>
    </div>
</template>

<script>
import Vue from 'vue'
export default Vue.extend({
    data() {
        return {
            orders: [],
            order: {
                idCommande: '',
                date: '',
                prix: '', 
                statut: '',
            },
            orderId: '',
            edit: false
        }
    },

    methods: {
        fetchOrders() {
            fetch('api/orders')
                .then(res => res.json())
                .then(res => {
                    this.orders = res.data;
                    console.log(this.orders);
                })
        }
    },

    created() {
        this.fetchOrders();
    }
})
</script>

Page which call the component (orders.blade.php) :

@extends('layouts.app')

@section('content')
    <orders></orders>
@endsection

finally, layouts.app file :

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>{{ config('app.name', 'Laravel') }}</title>

    <!-- Scripts -->
    <script src="{{ asset('js/app.js') }}" defer></script>

    <!-- Fonts -->
    <link rel="dns-prefetch" href="https://fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet" type="text/css">

    <!-- Styles -->
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
</head>
<body>
    <div id="app">
            <nav class="navbar navbar-expand-md navbar-light navbar-laravel">
                    <div class="container">
                        <a class="navbar-brand" href="{{ url('./') }}">
                           MyOnlineCV
                        </a>
                        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
                            <span class="navbar-toggler-icon"></span>
                        </button>

                        <div class="collapse navbar-collapse" id="navbarSupportedContent">
                            <!-- Left Side Of Navbar -->
                            <ul class="navbar-nav mr-auto">

                            </ul>

                            <!-- Right Side Of Navbar -->
                            <ul class="navbar-nav ml-auto">
                                <!-- Authentication Links -->
                                @guest
                                    <li class="nav-item">
                                        <a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
                                    </li>
                                    <li class="nav-item">
                                        <a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
                                    </li>
                                @else
                                    <li class="nav-item dropdown">
                                        <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
                                            {{ Auth::user()->username .' '. Auth::user()->email }} <span class="caret"></span>
                                        </a>

                                        <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
                                            <a class="dropdown-item" href="{{ route('commandes') }}"> Mes commandes </a>

                                            <a class="dropdown-item" href="{{ route('logout') }}"
                                               onclick="event.preventDefault();
                                                             document.getElementById('logout-form').submit();">
                                                {{ __('Logout') }}
                                            </a>

                                            <form id="logout-form" action="{{ url('/logout') }}" method="GET" style="display: none;">
                                                @csrf
                                            </form>
                                        </div>
                                    </li>
                                @endguest
                            </ul>
                        </div>
                    </div>
                </nav>

        <main class="py-4">
            <div id="app">
                <div class="container">
                    @yield('content')
                </div>
            </div>
        </main>
    </div>

<script src="{{ asset('js/app.js') }}"></script>
</body>
</html>

3 Answers 3

1

Maybe you have already fixed it but in my case I was using an arrow function in methods but it was not working this way. I had to change it to "normal" function declaration like so:

methods: {
    fetchOrders: function() {
        fetch('api/orders').then(res => res.json())
        .then(res => {
            this.orders = res.data;
            console.log(this.orders);
        });
    }
},  
Sign up to request clarification or add additional context in comments.

Comments

0

Try to remove this from your component`s data() method:

        ...
        order: {
            idCommande: '',
            date: '',
            prix: '', 
            statut: '',
        },
        orderId: '',
        ...

You declare "order" in v-for section:

v-for="order in orders"

2 Comments

Did you re-compile app after removing order:{...} ?
@AfrazAhmad Yes i did
0

May be you forgot to recompile your app after making change.

Remove order object from data()

 order:{
  idCommande: '',
        date: '',
        prix: '', 
        statut: '',
 }

and recompile the app using:

npm run dev

Moreover: We create this kind of objects when we are going to submit some data using a form.

For example

For signup/register, we get user name, email, age, etc and save it into an object like below by calling each value in a template (e.g. user.name)

user:{
   name:'',
   email:'',
   age: '',
}

and then we just send user object via axios or fetch to the server.

1 Comment

Yes I recompiled the app after removing the 'order' object, but I stil have the same issue

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.