Vue.js用v-for怎么获取ajax的数据

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript" src="lib/vue.js"></script>
    <script type="text/javascript" src="lib/jquery.js"></script>
</head>
<body>
    <div id="app">
        <a v-for="list in msgList">{{list.message}}</a>
    </div>
</body>
<script type="text/javascript">
    var arr=new Array();
    var message=$.ajax({
                url: '/laravel/public/DanmakuR/DanmakuR_main_player_video_message_center/1',
                type: 'get',
                dataType: 'json',
            })
            .done(function() {
                for (var i = 0; i < message.responseJSON.length; i++) {
                    arr[i]={message:message.responseJSON[i].message,url:message.responseJSON[i].url};
                }
            })
            .fail(function() {
                //console.log("error");
            })
            .always(function() {
                //console.log("complete");
            });
            console.log(arr);
    var app=new Vue({
        el:"#app",
        data:{
            msgList:arr,
        },
    });
</script>
</html>

ajax返回的数据

[{"uuid":"22056b8f-aa6c-11e7-94fa-005056c00001","message":"\u6d4b\u8bd5\u8fde\u63a5","url":"http:\/\/192.168.1.1"},{"uuid":"75f1db62-aa6c-11e7-94fa-005056c00001","message":"test2","url":"http:\/\/192.168.1.2"}]
阅读 7.4k
8 个回答

涉及到生命周期,在created发送ajax请求

ajax是异步操作 需要在你实例化Vue后 ajax返回成功后重新赋值

var arr=new Array();
var message = [{"uuid":"22056b8f-aa6c-11e7-94fa-005056c00001","message":"\u6d4b\u8bd5\u8fde\u63a5","url":"http:\/\/192.168.1.1"},{"uuid":"75f1db62-aa6c-11e7-94fa-005056c00001","message":"test2","url":"http:\/\/192.168.1.2"}];
console.log(message);
for (var i = 0; i < message.length; i++) {
  arr[i]={message:message[i].message,url:message[i].url};
};
var app=new Vue({
    el:"#app",
    data:{
        msgList:arr,
    },
});

我用你的数据重新写了下,是可以出来的, 你可以console一下你的ajax数据message.responseJSON.length感觉有点怪怪的

先在data中声明一个变量存放获得的数据,先初始化为空,例如:

data () {
      return {
        cont: []
      }
    }

然后将你获取到数据赋值,再在html中进行引用

v-for="item in cont"

这样就可以了

建议:理解下js的单线程机制
解决方法:
1.你可以把ajax放在created的钩子里面
2.你可以把ajax改成同步的,加个api async:false

不过,最优雅的还是写一个axios到created里面去

console.log(arr)放在done的回调函数最后试试,你应该没有理解JS单线程,异步同步的问题

直接赋值或更改数组里面的东西是没办法触发更新的。讲道理你在for循环结束之后加一行arr.push()手动触发视图更新就可以

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题