await 与 v-for遍历 异步的问题

最近再做练习.
我想要 随着点击触发按钮事件Click,然后K值加一,再重新请求数据,并重新渲染到界面上.
我现在只能实现点击按钮实现K值为1的渲染与请求.
不管点击多少次,请求时的url里的k值都为1.

img

// interface 定义一个接口 名字叫ListData 然后接口里面定义一个list 然后类型是 any类型的数组[]
interface ListData {
  list: any[];
}
// 定义一个reactive的响应式数据的变量 名字叫newsList 然后这个数据里面有个数组list 定义的为空数组
const newsList: ListData = reactive({
  list: []
})

let k = 1




function getData(k) {
  return new Promise((resolve, reject) => {
      request({
      url: 'http://www.smartvalve.net/IOT/service/page/alarm?' + 'paged=' + `${k}` + '&pageSize=50',

      method: 'post',
      data: {

      }
      // ,
      // headers: {
      //   "USER-KEY": key,
      // }

    }).then(res=>{
      
      newsList.list = res.data.data.data
      console.log(newsList.list);
      resolve(newsList.list)
    })

    
    
  });
}


async function Click(k) {

this.newsList.list = await getData(k)

  k = k + 1
}


应该是this.data0,而不是data0,改一下试试


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

引用 皆我百晓生 小程序回复内容作答:
根据你描述的情况,你想通过axios请求获取一个数组的数据,在点击按钮时通过v-for循环将数据渲染到页面上。问题可能出在异步操作上。在v-for循环中使用异步操作可能会导致数据获取不及时,从而无法及时渲染到页面。要解决这个问题,你可以使用async/await来处理异步操作。在点击按钮时,调用一个async函数来请求数据并等待结果返回,然后再将数据渲染到页面上。

这里是一个示例代码,你可以参考一下:

<template>
  <div>
    <button @click="handleClick">获取数据</button>
    <ul>
      <li v-for="item in data" :key="item.id">
        {{ item.name }}
      </li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      data: [] // 数据列表
    };
  },
  methods: {
    async getData() {
      try {
        const response = await axios.get('/api/data'); // 发起异步请求
        this.data = response.data; // 更新数据列表
      } catch (error) {
        console.error(error);
      }
    },
    handleClick() {
      this.getData(); // 请求数据并更新列表
    }
  }
}
</script>

在上面的代码中,我定义了一个名为getData的async函数,它通过axios发起异步请求,然后更新data数组的值。在点击按钮的时候,调用getData函数来获取数据并更新列表。

希望以上解释能帮助到你,如果还有其他问题,请随时追问。

你这data0写错了吧this.data0吧,怎么都报错了

await那一行赋值时应该使用this.data0确保将data0的值设置了

promise的概念我建议你去了解一下再来写代码

// interface 定义一个接口 名字叫ListData 然后接口里面定义一个list 然后类型是 any类型的数组[]
interface ListData {
  list: any[];
}
// 定义一个reactive的响应式数据的变量 名字叫newsList 然后这个数据里面有个数组list 定义的为空数组
const newsList: ListData = reactive({
  list: []
})

let k = 1




function getData(k) {
  return new Promise((resolve, reject) => {
      request({
      url: 'http://service/page/alarm?' + 'paged=' + `${k}` + '&pageSize=50',

      method: 'post',
      data: {

      }
      // ,
      // headers: {
      //   "USER-KEY": key,
      // }

    }).then(res=>{
      
      newsList.list = res.data.data.data
      console.log(newsList.list);
      resolve(newsList.list)
    })

    
    
  });
}

async function Click(k) {

this.newsList.list = await getData(k)

  
}


在每次点击触发事件Click时 k的值都是1 我该怎么设置可以让每次点击之后 k 都加一 然后可以重新axios请求数据 再重新渲染到界面上呢

【以下回答由 GPT 生成】

针对你的问题,可能是因为异步请求的原因导致数据不渲染在页面上。以下是一个可能的解决方案:

  1. 首先,在你的代码中,将获取数据的函数封装成一个异步函数,确保它返回一个Promise对象。例如,你可以将点击按钮时获取数据的逻辑封装在一个函数getData中:
async function getData() {
  try {
    const response = await axios.get('your_api_url');
    return response.data;
  } catch (error) {
    console.error(error);
    throw error;
  }
}
  1. 在你的Vue组件中,定义一个data属性来存储获取到的数据和一个用于控制渲染的变量。例如:
data() {
  return {
    dataArray: [], // 存储获取到的数据
    isDataLoaded: false // 控制是否渲染数据
  };
}
  1. 在点击按钮的事件处理函数中调用getData方法获取数据,并将获取到的数据赋值给dataArray,并将isDataLoaded设置为true。例如:
methods: {
  async handleClick() {
    this.dataArray = await getData();
    this.isDataLoaded = true;
  }
}
  1. 在你的HTML模板中,使用v-if指令来控制是否渲染数据。当数据加载完毕后,使用v-for指令遍历dataArray,并在页面上进行渲染。例如:
<div>
  <button @click="handleClick">点击获取数据</button>
</div>
<div v-if="isDataLoaded">
  <p v-for="item in dataArray" :key="item.id">{{ item.name }}</p>
</div>

这样,当你点击按钮时,会触发handleClick方法,异步获取数据并将数据渲染在页面上。

如果以上方案不能解决你的问题,请提供更多的代码和错误信息。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^