vue 使用tab组件切换读取本地json数据

发布于 2022-09-05 00:14:59 字数 2686 浏览 22 评论 0

我是参考 http://blog.csdn.net/qq_16559... 实现Tab切换

我是新手,想向大家请教两个问题:

  • 目前代码报错,read property 'push' of undefined name is not defined,不知道是不是this和self的地方处理的不对

  • 另外,考虑到a.vue和b.vue只是读取的json的名称不一样,不知道是否有更合适的办法来重用,代码有不合适或者需要改进的地方,也烦请诸位多多指正。

App.vue 如下:

<template>
  <div id="app">
    <div class="top">
      <ul>
        <li @click='tabToggle("a");'>A</li>
        <li @click='tabToggle("b");'>B</li>
      </ul>
    </div>
    <div>
      <component :is='currentView' keep-alive></component>
    </div>
  </div>
</template>

<script>
import A from './component/A.vue';
import B from './component/B.vue';

export default {
  name: 'app',
  data () {
    return {
      currentView: 'a',
    }
  },
  created: function () {
    this.getData();
  },
  components: {
    a: A,
    b: B
  },
  methods: {
      tabToggle: function(tabText) {
          this.currentView = tabText
      }
  }
}
</script>

A.vue如下:

<template>
    <div id="a">
        <h1>{{ name }}</h1>
        <h2>{{ desc }}</h2>
        <table>
            <thead>
            <tr>
                <td>Name</td>
                <td>Status</td>
            </tr>
            </thead>
            <tbody>
            <tr v-for="item in itemList" :id="item.id" style="">
                <td>{{item.name}}</td>
                <td>{{item.after[0].result.status}}</td>
            </tr>
            </tbody>
        </table>
    </div>
</template>

<script>
    export default {
        name: 'a',
        data () {
            return {
                itemList:[],
                name,
                desc
            }
        },
        created: function () {
            this.getData();
        },
        methods: {
            getData:function () {
                var self = this;
                this.$http.get("data/a.json").then(function (res) {
                    self.name = res.body[0].name;
                    self.desc = res.body[0].description;
                    for(var i= 0,len=res.body[0].elements.length;i<len;i++){
                        var resultData = res.body[0].elements[i];
                        self.itemList.push(resultData);
                    }
                })
            }
        }
    }
</script>

非常感谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寻找我们的幸福 2022-09-12 00:14:59

报错的原因楼上正解,定义就好了

 data () {
    return {
        itemList:[],
        name: '',
        desc: ''
    }
}

获取json可以在父组件做:

getData:function (url) {
    var self = this;
    this.$http.get(url).then(function (res) {
        self.name = res.body[0].name;
        self.desc = res.body[0].description;
        for(var i= 0,len=res.body[0].elements.length;i<len;i++){
            var resultData = res.body[0].elements[i];
            self.itemList.push(resultData);
        }
    })
}

这样接口就可以重用,然后把接口返回来的数据传给子组件即可。
然后还可以在传一个type,通过type来把接口传回来的数据付给不同的字段,再根据字段判断是否为空而是否继续访问接口,这样两个接口只要访问一次,有数据后再也不用访问,然后担心会子组件有更新json的情况,在原来基础上加上更新的功能传过去即可

props的用法:
父组件 <xxx :aaa="你要的数据"></xxx>
子组件: props: ['aaa']

沫雨熙 2022-09-12 00:14:59

第一点:
return {

itemList:[],
name,
desc

}
这里的写法有问题,这么写相当于return {name: name, desc: desc},所以会报undefined的错。
第二点:既然区别只是读取文件的不同,你可以传入一个props给字组件,在子组件里监听这个props值变化,来决定读取的是哪个json文件

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文