【问题标题】:Converting Laravel Blades to Vue 3 (what's Vue Conditional Rendering equivalent of Laravel Blade Directives?)将 Laravel Blades 转换为 Vue 3(什么是 Vue 条件渲染等效于 Laravel Blade 指令?)
【发布时间】:2022-01-04 13:44:09
【问题描述】:

我决定更改问题并单独尝试。我尝试将 Laravel Blade 转换为 Vue 3 页面,但结果与我预期的不一样。

这是 Laravel Blade 代码:

<table id="mahasiswa" class="table table-bordered table-hover">
                    <thead>
                        <tr>
                            <th width="20vh">No</th>
                            <th width="75vh">NIM</th>
                            <th>Nama</th>
                            @foreach($kriteria as $krit)
                            <th>{{$krit->nama}}</th>
                            @endforeach
                            <th width="100vh">Aksi</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php $no = 1; ?>
                        @if(!empty($mahasiswa))
                        {{-- variable $mahasiswa berisi nilai dari setiap kriteria per mahasiswa --}}
                        @foreach($mahasiswa as $mhs)
                        <tr>
                            <td>{{$no++}}</td>
                            <td>{{$mhs->nim}}</td>
                            <td>{{$mhs->nama}}</td>
                            @if(count($mhs->nilai) == 0)
                            @foreach($kriteria as $krit)
                            <td><i>Tidak ada data</i></td>
                            @endforeach
                            @endif
                            @foreach($mhs->nilai as $nilai)
                            <td>{{$nilai->nilai_alt}}</td>
                            @endforeach
                            <td class="text-center">
                                @if(count($mhs->nilai) == 0)
                                <a href="{{ route('nilai.tambah',['id' => $mhs->id]) }}" class="btn btn-sm btn-primary">
                                    <i class="fas fa-plus"></i>
                                </a>
                                @else
                                <a href="{{ route('nilai.edit', ['id' => $mhs->id]) }}" class="btn btn-sm btn-warning">
                                    <i class="fas fa-pen"></i>
                                </a>
                                @endif
                            </td>
                        </tr>
                        @endforeach
                        @endif
                    </tbody>
                </table>

这是我对 Vue 3 的转换工作(我使用 Tailwind CSS 3,以防你感到困惑):

import axios from 'axios'
import { onMounted, ref, computed } from 'vue'
import SideBar from './../../../components/SideBar.vue'

export default {
    components: {
        SideBar,
    },

    setup() {
        let peserta1 = ref([])
        let result = ref([])
        let penilaian1 = ref([])
        let subkriteria = ref([])

        onMounted(() => {
            axios
                .get('http://127.0.0.1:8000/api/penilaian1')
                .then((result) => {
                    penilaian1.value = result.data
                })
                .catch((err) => {
                    console.log(err.response)
                })
        })

        onMounted(() => {
            axios
                .get('http://127.0.0.1:8000/api/penilaian1/table_sk1')
                .then((result) => {
                    subkriteria.value = result.data
                })
                .catch((err) => {
                    console.log(err.response)
                })
        })
        onMounted(() => {
            axios
                .get('http://127.0.0.1:8000/api/penilaian1/peserta1')
                .then((result) => {
                    peserta1.value = result.data
                })
                .catch((err) => {
                    console.log(err.response)
                })
        })
        const transpose = () => {
            penilaian1.value.forEach((dat) => {
                if (!result.value.find((r) => r.nim === dat.nim)) {
                    result.value.push({ nim: dat.nim, nama: dat.nama })
                }
            })
            penilaian1.value.forEach((dat) => {
                let res = result.value.find((r) => r.nim === dat.nim)
                res[dat.id_sk1] = dat.nilai
            })
            console.log(result)
        }

        return {
            peserta1,
            penilaian1,
            subkriteria,
            transpose,
        }
    },
}
<template>
    <div class="relative min-h-screen md:flex">
        <SideBar />
        <div class="flex-1">
            <div class="col-12">
                <h1 class="px-6 py-6 mb-6 text-3xl font-extrabold">
                    Data Penilaian
                </h1>
            </div>
            <div class="col-12">
                <div class="flex-1">
                    <div class="overflow-y-auto sm:-mx-6 lg:-mx-8">
                        <div class="py-2 inline-clip sm:px-6 lg:px-12">
                            <div
                                class="overflow-hidden shadow-md sm:rounded-lg"
                            >
                                <table class="min-w-full">
                                    <thead class="bg-gray-100 dark:bg-gray-700">
                                        <tr>
                                            <th
                                                scope="col"
                                                class="px-6 py-3 text-xs font-medium tracking-wider text-left text-gray-700 uppercase  dark:text-gray-400"
                                            >
                                                NIM
                                            </th>
                                            <th
                                                scope="col"
                                                class="px-6 py-3 text-xs font-medium tracking-wider text-left text-gray-700 uppercase  dark:text-gray-400"
                                            >
                                                Nama
                                            </th>
                                            <th
                                                v-for="subkriteria in subkriteria"
                                                :key="subkriteria.id"
                                                scope="col"
                                                class="px-6 py-3 text-xs font-medium tracking-wider text-left text-gray-700 uppercase  dark:text-gray-400"
                                            >
                                                {{ subkriteria.nama }}
                                            </th>
                                            <th
                                                scope="col"
                                                class="relative px-6 py-3"
                                            >
                                                <span class="sr-only"
                                                    >Aksi</span
                                                >
                                            </th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                        <!-- Product 1 -->
                                        <template v-if="peserta1.count == 0">
                                            <tr
                                                v-for="peserta1 in transpose"
                                                :key="peserta1.id"
                                                class="bg-white border-b  dark:bg-gray-800 dark:border-gray-600"
                                            >
                                                <td
                                                    class="px-6 py-4 text-sm font-medium text-gray-900  whitespace-nowrap dark:text-white"
                                                >
                                                    {{ peserta1.nim }}
                                                </td>
                                                <td
                                                    class="px-6 py-4 text-sm text-gray-500  whitespace-nowrap dark:text-gray-400"
                                                >
                                                    {{ peserta1.nama }}
                                                </td>
                                                <template
                                                    v-if="peserta1.length == 0"
                                                >
                                                    <td
                                                        v-for="subkriteria in subkriteria"
                                                        :key="subkriteria.id"
                                                        class="px-6 py-4 text-sm font-medium text-right  whitespace-nowrap"
                                                    >
                                                        Tidak ada data
                                                    </td>
                                                </template>
                                                <template>
                                                    <td
                                                        v-for="penilaian in penilaian1"
                                                        :key="penilaian.id"
                                                        class="px-6 py-4 text-sm font-medium text-right  whitespace-nowrap"
                                                    >
                                                        {{ penilaian.nilai }}
                                                    </td>
                                                </template>
                                                <td
                                                    v-if="penilaian.nilai == 0"
                                                    class="px-6 py-4 text-sm font-medium text-right  whitespace-nowrap"
                                                >
                                                    <router-link
                                                        :to="{
                                                            name: 'penilaian1.tambah',
                                                            params: {
                                                                id: penilaian.nim,
                                                            },
                                                        }"
                                                        class="text-blue-600  hover:text-blue-900 dark:text-blue-500 dark:hover:underline"
                                                        >Tambah</router-link
                                                    >
                                                </td>
                                                <td
                                                    v-else
                                                    class="px-6 py-4 text-sm font-medium text-right  whitespace-nowrap"
                                                >
                                                    <router-link
                                                        :to="{
                                                            name: 'penilaian1.edit',
                                                            params: {
                                                                id: penilaian.nim,
                                                            },
                                                        }"
                                                        class="text-blue-600  hover:text-blue-900 dark:text-blue-500 dark:hover:underline"
                                                        >Edit</router-link
                                                    >
                                                </td>
                                            </tr>
                                        </template>
                                    </tbody>
                                </table>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>

但结果是:

Result in VueJS 3

我没有看到任何基于标准数据表的列循环(因此标准列可以根据此表动态显示)和带有空等级数据的 nilai/grade 数据

我的期望是:

Original app in Laravel

请指导我进行 Laravel Blade 的 Vue 转换,并告诉我 Laravel Blade 指令的 Vue 条件渲染等效项(主要主题和问题),因为 PHP 和 JavaScript 不同,请给我一些关于我的 Vue 代码的反馈。

【问题讨论】:

    标签: javascript php laravel vuejs3


    【解决方案1】:

    如果前端应用程序出现问题,请先检查console,重新考虑编辑您的问题,在您的console 中添加消息,如果您希望您的听众更多地了解您的问题,请简单的codepen

    而对于您的代码,它大多不起作用,

    // Dont do this
    <th v-for="subkriteria in subkriteria" ...>
        {{ subkriteria.nama }}
    </th>
    
    // Try this
    <th v-for="sub in subkriteria" ...>
        {{ sub.nama }}
    </th>
    

    查看文档,Vue JS List Rendering

    如果我没记错的话,在下面的代码中

    // Will not work
    <tr v-for="peserta1 in transpose" ...>
        ...
    </tr>
    
    const transpose = () => {
         penilaian1.value.forEach((dat) => {
              if (!result.value.find((r) => r.nim === dat.nim)) {
                   result.value.push({
                        nim: dat.nim,
                        nama: dat.nama
                   });
              }
         });
         penilaian1.value.forEach((dat) => {
              let res = result.value.find((r) => r.nim === dat.nim);
              res[dat.id_sk1] = dat.nilai;
         });
         console.log(result);
    };
    

    transposemethod,在v-for中需要objectarrayrange

    【讨论】:

      猜你喜欢
      • 2020-03-28
      • 2018-05-12
      • 2020-07-02
      • 2023-02-03
      • 2020-03-30
      • 1970-01-01
      • 2018-11-20
      • 2017-03-21
      • 2022-01-18
      相关资源
      最近更新 更多