【问题标题】:PHP API WITH VUE.JS带有 VUE.JS 的 PHP API
【发布时间】:2019-03-12 21:59:57
【问题描述】:

我使用 PHP 创建了我的 API,链接如下:https://monstajams.co/streaming/rest/api/album/read.php

但是每当我使用 axios 将其放入我的 Vue.js (Home.vue) 文件中时,前端都不会显示任何数据。

下面是我的代码:

<ul class="ta-track-list" v-if="faqs && faqs.length">
        <li class="ta-track-card column col-2 flex-column" v-for="faq of faqs">
            <div class="inner">
                <div class="artwork" role="link">
                    <span role="link" style="background-image: url(http://localhost/mymusic/assets/images/artwork/Wizkid-Soco.jpg);">

                    </span>
                        <div class="hover flex align-center justify-center">
                            <button id="webutton" class="ta-secondary play" onclick='playSong()'>
                                <i class="material-icons">play_arrow</i>
                            </button>
                        </div>
                </div>
                    <div class="info">
                        <div class="title white-primary-hover" role="lin">{{ faqs }}</div>  
                        <div class="username light-white-hover" role="link">{{ faq.artist }}</div>  
                        <div class="released">{{ faq.duration }}</div>
                    </div>  
            </div>
        </li>
    </ul>


<script>
import axios from 'axios';

export default {
    name: 'home',
    data: () =>({
        faqs: [],
        errors: []
    }),

    created() {
        axios.get('https://monstajams.co/streaming/rest/api/album/read')
        .then(response => {
            this.faqs = response.data;
        })
        .catch(e => {
            this.errors.push(e)
        })
    }
}
</script>

【问题讨论】:

  • 您能告诉我们您的组件数据是如何构成的吗?
  • 如果你的 vue 应用在本地主机上,它必须是 CORS
  • 内部 catch(e) - 你能 console.log out e 吗?
  • @darklightcode 我的标题 // 标题 header('Access-Control-Allow-Origin: *'); header('Content-Type: application/json');
  • @darklightcode 看起来不像 CORS 问题 - codesandbox.io/s/…

标签: javascript php html vue.js


【解决方案1】:

问题是您的代码错误地假定axios.get() 解析为原始响应,但它实际上解析为response wrapper,其中原始响应包含在包装器的data 子属性中,巧合的是名称作为响应中的目标属性。

您可以更改您的 Axios 响应处理程序以获取内部 data 字段:

axios.get('https://monstajams.co/streaming/rest/api/album/read')
     .then(response => {
       // this.faqs = response.data; // response.data is the raw response, but you need the array within the response (also named "data")
       this.faqs = response.data.data;
     })

demo

或者不理会您的前端,并更新您的 PHP 后端以仅在响应中发送数组:

// FROM THIS RESPONSE:
{
  data: [/* PLAYLIST DATA */]
}

// TO THIS RESPONSE:
[/* PLAYLIST DATA */]

【讨论】:

    【解决方案2】:

    您没有根据 Vue 文档更新您的数据。

    有关被动更改,请参阅此document

    在下面的示例中,我在安装 Vue 之前更新了我的列表,因此可以相应地进行渲染。

    let vm = new Vue({
      el: "#app",
      data: {
        todos: []
      },
      methods: {
        updateList() {
    
          axios.get('https://monstajams.co/streaming/rest/api/album/read')
            .then(res => {
    
              res.data.data.forEach(item => {
    
                Vue.set(vm.todos, vm.todos.length, {
                  text: item.title,
                  done: true
                })
    
              })
    
            })
    
        }
      },
      beforeMount() {
        this.updateList()
      },
    })
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>
    <div id="app">
      <h2>Todos:</h2>
      <ol>
        <li v-for="todo in todos">
          <label>
            <span>
              {{ todo.text }}
            </span>
          </label>
        </li>
      </ol>
    </div>

    【讨论】:

    • @downvoter 请解释我的答案是如何不充分并值得一票否决
    • beforeMount 方法中,我触发this.updateList 方法,在渲染发生之前更新todo 列表。这基本上是你的代码,我只是使用beforeMount 而不是created,请参阅 vue 文档以获取更多信息和这篇文章以快速阅读stackoverflow.com/questions/40714319/…,请修改你的投票,stackoverflow 不是关于修复你的代码,而是关于为您指明正确的方向。
    • 猜测 这个答案被否决了,因为 (1) 它声称需要 Vue.set 来解决 OP 的问题(但这不是真的,而且根本问题实际上是别的东西),并且(2)它极大地改变了API数据的上下文(从播放列表到待办事项列表),这可能会让读者感到困惑。
    猜你喜欢
    • 2018-07-26
    • 1970-01-01
    • 2021-10-13
    • 2015-10-26
    • 2020-04-15
    • 2017-12-16
    • 1970-01-01
    • 2019-01-02
    • 2020-11-12
    相关资源
    最近更新 更多