VUEJS:是否可以 process/modify 在显示之前通过 v-for 检索数据?

VUEJS: Is it possible to process/modify data retrieved through v-for before displaying?

您好,总的来说,我是 Web 应用程序开发的新手/javascript。在过去的 4 个月里,我只给自己上了 udemy 视频的速成课程。

对于我的 Web 应用程序,我使用 axios 通过服务器端后端从数据库中检索数据。我有一个 logRepository 数组,用于推送检索到的数据。

data() {
      return {
        logRepository: [],
      }
    },
created() {
      axios.get('/myrestapiroute', {
        headers: {
          'Authorization': `Bearer ${this.$store.state.token}`
        },
        params: {
          userId: this.userId
        }
      })
      .then(res => {
        const data = res.data.logs
        this.dataCheck = data
        for(let key in data) {
          const log = data[key]
          log.id = key
          this.logRepository.push(log)
        }
      })

在我的模板上,我使用 v-for 循环遍历所有检索到的数据元素:

 <div ..... v-for="(log,index) in logRepository" :key="index">

在 v-for 到位的情况下,我如何在段落标记中显示我的数据的一个示例。格式取决于数据的结构。

<p style="text-align: justify;">
 {{ log.logId.jobPerformed }}
</p>

当我尝试对文本应用样式时出现问题。正如您在上面看到的,我想使用 text-align: justify。我还想保留 whitespace 用户通过使用 white-space: pre-wrap.[=21= 输入的方式]

(https://i.imgur.com/dwaJHT9.png)

但问题是这两种风格不能很好地协同工作。如下图所示,如果我单独使用 justify,它的行为正常(除了 whitespace 丢失)。但是,如果我将 text-align:justify 和 white-space: pre-wrap 结合使用,文本最终会以间距对齐,但会以一种奇怪的方式对齐。

(https://i.imgur.com/DQSfOya.png)

对于简短的条目,它们以奇怪的缩进开头,而起始端应与列的左侧对齐。这个问题似乎不仅仅是一开始的白色spaces,正如我所尝试的那样。trim() 正如贡献者所建议的那样。

(https://i.imgur.com/uwysk9X.png)

我尝试调整 CSS,使用 text-align-last、text-align-start、direction: ltr、pre-tags 等。但它无法正常工作。 来自其他 SO 页面的建议建议在显示之前通过执行将所有 \n 替换为 br 的字符串来处理数据。

是否可以在显示之前对从 v-for 获得的单个数据进行处理,或者必须使用计算 属性 对数组进行处理?

由于我的数据是从数据库中获取的,我对如何实现数据的预处理感到困惑,因为我的数组大小是动态的并且因每个用户而异。

对于这种情况,在显示之前实现数据预处理的最佳方法是什么?

下图是我的对象数组 (logRepository) 的样子。格式主要是由于 mongoDB 模式。 (https://i.imgur.com/7SilcF7.png)

=======解决方案=======

我修改了 .then 块中的对象变量,并将所有 \n 字符替换为
标记。

https://i.imgur.com/EtLX2tg.png

这样我的显示就不再需要 "white-space: pre-wrap" 样式了。但是,由于我之前使用字符串插值来显示我的数据,因此
标签被视为纯文本。

https://i.imgur.com/zUbNZbI.png

我必须修改标签以使用 v-html 绑定将数据显示为 html 文本,这样
才能工作。区别可以看最后一张图

https://i.imgur.com/sCTsCV4.png

感谢您在这方面的帮助,因为我对 javascript 还很陌生。

您可以在此处使用多种模式来 pre-process 您的数据。

  • 在您创建的 then 函数中处理您的数据
  • 将数据包装在模板中 {{ ... }} 块中的函数中
  • 创建一个组件,用作 v-for 循环迭代显示计算值的元素
  • 使用计算值作为主模板中 v-for 指令的源数组。这通常是使用映射到源数据的处理函数来完成的,如 log.map( data => data.logId.jobPerformed.trim()