从 Vue.js 中的 JSON 文件导入数据而不是手动数据

Posted

技术标签:

【中文标题】从 Vue.js 中的 JSON 文件导入数据而不是手动数据【英文标题】:Import data from a JSON file in Vue.js instead of manual data 【发布时间】:2019-04-08 16:12:55 【问题描述】:

这是我第一次使用 Vue.js。我制作了这个应用程序,它使用了我在脚本中手动添加的数据。现在我希望能够添加一个从中获取数据的 JSON 文件,但我不知道该怎么做。您可以在下面找到我的代码。

html

<div id="app">

<div class="search-wrapper">
    <input type="text" v-model="keyword" placeholder="Zoek telefoon..." />
</div>

<div class="wrapper">

    <table style="width:100%; text-align: left;">
      <tr>
        <th style="text-align: left; width: 33%">Telefoon</th>
        <th style="text-align: left; width: 33%">Scherm</th> 
        <th style="text-align: left; width: 33%">Batterij</th>
      </tr>
    </table>

    <div v-for="post in filteredList">        
        <table style="width:100%; text-align: left">
          <tr style="text-align: left;">
            <td style="text-align: left; width: 33%"> post.title </td>
            <td style="text-align: left; width: 33%"> post.scherm </td> 
            <td style="text-align: left; width: 33%"> post.batterij </td>
          </tr>
        </table>
    </div>

</div>

Vue.js:

var app = new Vue(
  el: '#app',
  data: 
    keyword: '',
    postList: [
       title: 'A', scherm: '35', batterij: '15' ,
       title: 'B', scherm: '65', batterij: '25' ,
       title: 'C', scherm: '40', batterij: '35' ,
       title: 'D', scherm: '35', batterij: '75' ,
       title: 'E', scherm: '20', batterij: '45' ,
    ],
  ,
  computed: 
    filteredList() 
      return this.postList.filter((post) => 
        return post.title.toLowerCase().includes(this.keyword.toLowerCase());
      );
    
  
);

编辑: 我的代码现在看起来像这样,但它现在只返回 post.title 等。

头:

<head>
<title>Test Vue JSON</title>
<script src="https://unpkg.com/vue@2.5.17/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="https://unpkg.com/vue-axios@2.1.4/dist/vue-axios.min.js"></script>

HTML:

<div class="search-wrapper">
    <input type="text" v-model="keyword" placeholder="Zoek telefoon..." />
</div>

<div class="wrapper">

    <table style="width:100%; text-align: left;">
      <tr>
        <th style="text-align: left; width: 33%">Telefoon</th>
        <th style="text-align: left; width: 33%">Scherm</th> 
        <th style="text-align: left; width: 33%">Batterij</th>
      </tr>
    </table>

    <div v-for="post in filteredList">        
        <table style="width:100%; text-align: left">
          <tr style="text-align: left;">
            <td style="text-align: left; width: 33%"> post.title </td>
            <td style="text-align: left; width: 33%"> post.scherm </td> 
            <td style="text-align: left; width: 33%"> post.batterij </td>
          </tr>
        </table>
    </div>

</div>

脚本:

import posts from "../posts.json";

  el: '#app',
  data: 
    keyword: '',
    postList: [],
  ,
  computed: 
    filteredList() 
      return this.postList.filter((post) => 
        return post.title.toLowerCase().includes(this.keyword.toLowerCase());
      );
    
  ,
  mounted()
   axios
       .get('posts.json')
       .then(response => (this.postList = response.data))
       
    

JSON(posts.json):

  [
     title: "Samsung Galaxy S9", scherm: "35", batterij: "15" ,
     title: "Huawei P10", scherm: "65", batterij: "25" ,
     title: "iPhone X", scherm: "40", batterij: "35" ,
     title: "Huawei P20 Lite", scherm: "35", batterij: "75" ,
     title: "Samsung A9", scherm: "20", batterij: "45" ,
 ]

【问题讨论】:

【参考方案1】:

Vue cli

将该数据设置在名为 posts.json 的文件中,然后按如下方式导入:

    import posts from "./posts.json";

并将其分配给 mounted 钩子中的 postList

  computed:
  .... 
  ,  
  mounted()
      this.postList=posts
        

CDN

在您的情况下,您应该使用像 axios 这样的 AJAX api

 computed:
  .... 
  ,  
  mounted()
       axios
           .get('posts.json')
           .then(response => (this.postList = response.data))
           
        

你应该包括以下脚本:

    <script src="https://unpkg.com/vue@2.5.17/dist/vue.js"></script>
   <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="https://unpkg.com/vue-axios@2.1.4/dist/vue-axios.min.js"></script>

完整示例

var app = new Vue(
  el: '#app',
  data: 
    keyword: '',
    postList: []
  ,
  computed: 
    filteredList() 
      return this.postList.filter((post) => 
        return post.title.toLowerCase().includes(this.keyword.toLowerCase());
      );
    
  ,
  mounted()
    axios.get('https://jsonplaceholder.typicode.com/posts')
        .then((response)=> 
          this.postList=response.data;
        )
  
);
<html lang="en" dir="ltr">

<head>
  <meta charset="utf-8">
  <title></title>
  <script src="https://unpkg.com/vue@2.5.17/dist/vue.js"></script>
  <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  <script src="https://unpkg.com/vue-axios@2.1.4/dist/vue-axios.min.js"></script>
</head>

<body>
  <div id="app">

  

    <div class="wrapper">

      <table style="width:100%; text-align: left;">
        <tr>
          <th style="text-align: left; width: 33%">ID</th>
          <th style="text-align: left; width: 33%">Title</th>
          <th style="text-align: left; width: 33%">Body</th>
        </tr>
      </table>

      <div v-for="post in postList">
        <table style="width:100%; text-align: left">
          <tr style="text-align: left;">
            <td style="text-align: left; width: 33%"> post.id </td>
            <td style="text-align: left; width: 33%"> post.title</td>
            <td style="text-align: left; width: 33%"> post.body </td>
          </tr>
        </table>
      </div>

    </div>
    </div>
</body>

【讨论】:

以上是关于从 Vue.js 中的 JSON 文件导入数据而不是手动数据的主要内容,如果未能解决你的问题,请参考以下文章

无法将 API JSON 数据呈现到 vue js 中的表

如何从 Vue.js 中的 JSON 文件中获取数据?

如何使用 vue.js 中的单击事件从数据表中删除行而不干扰计算函数

无法从 Vue.js 中的单个文件组件导入 Mixin

如何将 HTML 模板导入 Vue.js 项目?

VUE.JS 通过 webpack-simple 中的 axios 从 url 接收一个 json 文件