Vue2:将函数作为 prop 传递会触发 prop 已设置的警告

2023-11-30

我是 Vue 新手,到目前为止我很喜欢单文件组件。

在制作我真正想做的东西之前,我想我会尝试一些小事情来看看我是否掌握了这个概念。

因此,我开始制作一个用于打开 XMLHttpRequest 的组件,并带有进度条。

enter image description here

<template >
  <div  v-if="showQ">
    <div class="text-muted">
      <span>{{humanReadableLead}}</span>
      <span :class="'text-'+color">{{humanReadableMessage}}</span>
      <span>{{humanReadableEnd}}</span>
    </div>
    <div class="progress">
      <div
        class="progress-bar progress-bar-striped progress-bar-animated"
        :class="'bg-'+color"
        role="progressbar"
        :style="{width: String(percent)+'%'}"
        :aria-valuenow="percent"
        aria-valuemin="0"
        aria-valuemax="100"
      ></div>
    </div>

    <div class="text-right text-muted form-text text-small">
      <span class="float-left">{{xhrMessage}}</span>
      <span
        class="badge"
        :class="'badge-'+color"
        data-toggle="tooltip"
        data-placement="right"
        :title="readyStateTooltip"
        >
          {{xhr.readyState}}
        </span>
      <span
        class="badge"
        :class="'badge-'+color"
        data-toggle="tooltip"
        data-placement="right"
        :title="statusTooltip"
      >
        {{xhr.status}}
      </span>
      <span
        v-if="transferComplete"
        @click="goodbye"
        class="badge badge-secondary"
        data-toggle="tooltip"
        data-placement="right"
        title="Dismiss progress bar"
      >
        &times;
      </span>
    </div>
  </div>

</template>

<script>

import {httpStatusCodes, httpReadyStateCodes} from './http-responses';

export default {
  props: {
    method: {
      type: String,
      default: "GET",
      validator: function(value) {
        return ["GET", "POST", "PUT", "DELETE"].includes(value)
      }
    },
    url: {
      type: String,
      required: true
    },
    async: {
      type: Boolean,
      default: true
    },
    success: {
      type: Function,
      default: function() {
        console.log(this.xhr.response)
      }
    },
    readystatechange: {
      type: Function,
      default: function(event) {
      }
    },
    automaticCloseQ: {
      type: Boolean,
      default: false
    }
  },
  data: function() {
    return {
      xhr: new XMLHttpRequest(),
      httpStatusCodes:httpStatusCodes,
      httpReadyStateCodes:httpReadyStateCodes,
      color: "primary",
      percent: 0,
      humanReadableLead: "",
      humanReadableMessage: "",
      humanReadableEnd: "",
      xhrMessage: "",
      showQ: true,
      completeQ: false
    }
  },
  computed: {
    readyStateTooltip: function() {
      var rs = this.xhr.readyState,
      rsc = httpReadyStateCodes[rs]
      return `Ready state ${rs}: ${rsc}`
    },
    statusTooltip: function() {
      var s = this.xhr.status
      // s = s == 0 ? 218 : s
      var sc = httpStatusCodes[s]
      return `Status ${s}: ${sc}`
    },
    transferComplete: function() {
      return this.completeQ
    }
  },
  methods: {
    open: function() {
      this.xhr.open(this.method, this.url, this.async)
    },
    send: function() {
      this.xhr.send()
    },
    goodbye: function() {
      this.showQ = false
    }
  },

  created: function() {
    var that = this
    that.open()

    that.xhr.addEventListener("error", function(event) {
      that.color = "danger"
      that.xhrMessage = "An error has occured."
    })

    this.xhr.addEventListener("progress", function(event) {
      if (event.lengthComputable) {
        var percentComplete = event.loaded / event.total * 100;
        that.percent = percentComplete
      } else {
        that.percent = 100
        that.xhrMessage = "Unable to compute progress information since the total size is unknown."
      }
    })

    that.xhr.addEventListener("abort", function(event) {
      that.color = "danger"
      that.xhrMessage = "The transfer has been canceled by the user."
    });

    that.xhr.addEventListener("load", function(event) {
      that.color = "success"
      that.xhrMessage = "Transfer complete."
      that.completeQ = true
      if (that.automaticCloseQ) { that.showQ = false }
      that.success()
    })

    that.xhr.addEventListener("readystatechange", function(event) {
      that.readystatechange(event)
    })

    that.send()
  }
}
</script>

<style scoped>
</style>

and in 索引.html

<div id="request" style="width:50%;" >
  <http-request :url="'./<some-file>'"/>
</div>

with JS

var progress = new Vue({
  el: '#request',
  components: { httpRequest }
})

这效果相当好......

然而,有一些小错误我一生都无法弄清楚:

  • 我想定义一个函数onSuccess我传递给道具success,但这会引发 Vue 的错误
  • 计算出的属性statusTooltip没有更新
  • 试图设置automaticCloseQ无论我如何尝试绑定都会导致默认值

e.g.

var onSuccess = function() {console.log('here')}

<http-request :url="'./<some-file>'" :success="onSuccess" :automaticCloseQ="true"/>

我缺少什么?


希望这可以帮助。

我想定义一个函数 onSuccess 并将其传递给 prop success,但这会引发 Vue 的错误

你正在定义onSuccess在 Vue 之外。它应该在Vue中定义methods


statusTooltip 的计算属性未更新

在 Javascript 中,对象是通过引用传递的。xhr始终引用同一个对象。这就是计算值不会更新的原因。看https://v2.vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats。解决这个问题的一种方法是使用另一个称为xhrStatus并在 xhr 的事件侦听器中手动更新此状态。


无论我如何尝试绑定,尝试设置automaticCloseQ都会导致默认值

(我不知道这意味着什么......)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue2:将函数作为 prop 传递会触发 prop 已设置的警告 的相关文章

  • Azure Functions [JavaScript / Node.js] - HTTP 调用,良好实践

    从我的 Azure 函数 在 Node js 中运行 由 EventHub 消息触发 中 我想向某个外部页面发出发布请求 就像是 module exports function context eventHubMessages var ht
  • 跨域iframe自动调整大小

    我正在使用 iframe 和 javascript 制作一个 Web 小部件 我想让我的 iframe 能够根据其内容 从其他域加载 调整大小 我做了一些搜索 包括在 Stack Overflow 上 我找到了几个主题 但我找不到关于这个问
  • AngularJS 指令 - 设置多个指令元素的顺序(不是指令的优先级,而是元素的优先级)

    考虑带有指令 foo 的标记 div div div div div div 使 foo 按指定顺序而不是从上到下 3 1 2 运行的好方法是什么 我唯一能想到做的就是跟踪已运行的内容并在不按顺序的项目上返回 false 然后让 Angul
  • 单击量角器中元素的给定坐标

    我想点击我的特定位置canvas元素 所以我编写了以下量角器代码 var canvas element by id canvas var clickCanvas function toRight toBottom browser actio
  • 如何在 jQuery 中使用 CSS“background-image”属性添加的图像上绑定单击事件

    这是我的小提琴link http jsbin com otisur 1 edit 我想我的问题通过标题本身就很清楚了 尽管如此 我正在寻找一种绑定的方法click使用 css 添加的图像上的事件background image财产 我知道
  • Javascript:如何根据 html 标签扩展用户选择?

    乐代码 http jsfiddle net frf7w 12 http jsfiddle net frf7w 12 所以现在 当前的方法将完全按照 选择的方式获取所选文本 并添加标签 以便在显示时页面不会爆炸 但我想做的是 就是说 当用户选
  • 从 JavaScript 将参数传递给 p:remoteCommand

    我想将值传递给remoteCommand来自 JavaScript 如果这是可能的 我该如何做到这一点以及如何在支持 bean 中接收它们 对的 这是可能的 如何执行此操作取决于 PrimeFaces 版本 你可以在PrimeFaces 用
  • 有什么方法可以在不重新加载的情况下更改标头 URL? [复制]

    这个问题在这里已经有答案了 可能的重复 修改URL而不重新加载页面 https stackoverflow com questions 824349 modify the url without reloading the page 使用新
  • JavaScript 逻辑赋值是如何工作的?

    在 javascript 中 如果我们有一些代码 例如 var a one var b q a alert b 逻辑 OR 运算符会将 a 的值分配给 b 并且警报将为 一 这仅限于作业还是我们可以在任何地方使用它 似乎空字符串被视为与未定
  • 在js中检测浏览器的最佳方法

    JavaScript 中有很多浏览器检测方法 据我所知 使用navigator userAgent或检测特征 例如XMLHttpRequest 等等 谁能告诉我哪种方法最好 最有效 如果你真的需要知道什么browser他们正在使用 你主要需
  • Hydrate with RTK Query 确实会抛出错误

    我有一个非常简单的组件来显示来自本地 API 的数据 使用 Nextjs API 路由制作 我使用 RTK 查询来获取数据 const api createApi reducerPath data baseQuery fetchBaseQu
  • 设置股票数据 Highcharts xAxis 的格式

    我已经浏览了需要为 xAxis 属性设置的 Highcharts 选项来格式化时间标签 但没有运气了解这对于这种情况到底是如何工作的 我在白天 盘中 检索了股票的动态数据 我需要显示这些数据 因为检索的数据每天从 9 30 开始到 17 0
  • 以编程方式触发 highchart 散点图上某个点的单击事件

    实际上 我有一个小要求 其中有一个带有点列表和下拉列表的散点图 当我从下拉列表中选择一个项目时 应触发其相应的数据点单击 当我在图表上选择一个数据点时 必须执行一些操作 并且下拉列表应根据选择进行更新 我们有什么办法可以做到这一点吗 我尝试
  • 测量填写部分的时间 - 谷歌表单

    我正在尝试使用谷歌表单进行研究调查问卷 对于某些部分 我想自动测量用户填写所需的时间 谷歌表单中没有这样的选项 我尝试复制表单源 并用 javascript 填充时间 但它不起作用 跨源问题 未能成功托管复制的表单 如何做到 我如何衡量回答
  • Material.Angular.io mat-autocomplete [displayWith] 函数更新范围变量

    我遇到了一个问题 我可以在实例化 mat autocomplete 的组件控制器中访问本地声明的变量 我面临的问题是局部变量被困在这个范围内 我无法更新它们 有关更新 mat autocomplete 范围变量的任何想法或想法 最终我要做的
  • 是否可以让 webpacks System.import 使用 ajax (用于进度事件)?

    所以我刚刚更新到 webpack 2 并进行了第一个工作设置 其中 webpack 通过查看 System import 调用自动创建块 相当甜蜜 但是 我使用 ajax 调用加载初始块 以便我可以加载时显示进度 https stackov
  • 在部分渲染时执行 JavaScript

    我有一些 JavaScript 代码 我想在用户单击其文件夹之一后执行 它会触发 show 操作和 show js erb 从而呈 现部分内容 Show js erb 当用户单击其文件夹之一时触发 如下所示 body append 它成功注
  • 在 React JSX 中返回配对元素

    问题 在 React 中 您希望通过映射数组来创建 DOM 结构 但数组中的每个项目应返回 2 个元素 例如 import React from react import from lodash let Component React ex
  • 如何用时刻找到与给定时间最接近的时间?

    所以我有一个简单的代码 一个工作代码 它使用 moment 获取最接近给定时间的时间 Current time in millis const now moment 10 16 HH mm format x List of times co
  • 开玩笑 setTimeout 不暂停测试

    it has working hooks async gt setTimeout gt console log Why don t I run expect true toBe true 15000 我已经查看了这个答案 Jest 文档和几

随机推荐

  • 如何使用 asp.net Mvc 将文本值发送到我的控制器

    我是asp MVC新手 所以我将尝试使用ajax制作登录表单 所以我编写jsonresult来检查控制器中的用户名和密码 我在ajax中调用它 但当我写正确的用户名和密码时它不起作用显示在日志消息登录字段中 这是我的控制器代码 public
  • 如何让 MutationObserver 多次工作?

    我使用 MutationObserver 这样我就可以让 div 对变化做出反应 当它更改时 更改将显示在正下方的 div 中 但它只运行一次 如果我输入一些内容来 div 输入 div 则仅显示第一个字符 我在 MDN 上找到了这个 向元
  • 如何在 Tensorflow 中更新 2D 张量的子集?

    我想更新 2D 张量中值为 0 的索引 因此 data 是一个 2D 张量 其第二行第二列索引值将替换为 0 但是 我收到类型错误 有人可以帮我吗 类型错误 ScatterUpdate 操作的输入 ref 需要左值输入 data tf Va
  • 从其他常量构建常量变量列表

    我刚刚读完全部Objective C 全局常量变量问答 但我发现它们不适合我的问题 我需要一个像这样的变量列表 NSString baseURL http example org NSString mediaURL http example
  • 如何在PHP中使用换行符发送电子邮件

    请帮我在换行符中制作代码消息 我不知道该怎么做 请检查我的代码 希望你能帮助我 预先非常感谢
  • 使用全局变量会影响 MATLAB 的性能吗?

    据我了解 MATLAB不能使用pass by reference向其他函数发送参数时 我正在进行音频处理 并且经常需要将波形作为参数传递给函数 并且因为 MATLAB 使用pass by value对于这些论点 当我这样做时 它确实消耗了大
  • Spring Data REST:MongoDB 存储库的自定义查询

    我正在尝试创建一个自定义查询Spring 指南 使用 REST 访问 MongoDB 数据根据参考4 4 自定义实现 但我的自定义方法无法从存储库的 REST 接口 user search 中使用 例如浏览器无法找到 localhost 8
  • 保持 CSS 网格中列之间的比例。 grid-column是如何计算的?

    我希望我的网格保持一定的比例 但是长句子会增加它所属网格的宽度 body display grid main grid column 1 8 border 2px solid black aside grid column 8 13 bor
  • 将一张图像旋转到另一张图像下方

    我目前正在尝试旋转图像 然后在不旋转的顶部绘制图像 但每当我使用 g2d rotate Math toRadians rot x 15 y 15 我之后绘制的每张图像也会旋转 有什么方法可以旋转一张图像而不旋转其余图像 天哪 这真的很难解释
  • Delphi TWebBrowser 在 AJAX 加载后获取 HTML 源

    我有以下函数 可以在 DocumentComplete 事件之后获取 HTML 文档的源代码 function TBrowser GetWebBrowserHTML const WebBrowser TWebBrowser string v
  • javascript 中有 getElementsByClassName 吗?

    就像在 jQuery 中我们可以使用 classname 一样 在 javascript 中也有类似的东西吗 或者如果我们没有这样的方法那么我该如何实现它 根据http www dustindiaz com getelementsbycla
  • 在 Less 中将 px 转换为 em

    Scss 相当于什么emCalc 不到 padding emCalc 24px 在Scss中将根据视点和缩放级别计算em less中有内置函数吗 您可以这样做将 px 转换为 em font size 16 Your base font s
  • 为什么子任务的许多异常中只传播其中之一?

    我正在努力更好地掌握 TPL 中异常和错误处理的基本原理 并且在 NET 4 5 异步 等待任务中运气更好 The slightly modified from my earlier question How to better under
  • rand() 在多个函数调用中保持一致

    当我尝试从函数调用中生成 2 个随机数时 我得到了重复的结果 但是 那rand 函数在循环或其他函数中工作得很好 只要它们在函数调用之外 我猜这是因为系统时间和程序很小 但我不知道还有什么办法可以改变种子 include
  • Playframework + Tomcat 部署问题

    我正在尝试在 Tomcat 中部署一个在 play 框架中开发的 Web 应用程序 前几次尝试时 我在 Tomcat 控制台中收到以下消息 INFO validateJarFile C Tomcat7 webapps sandbox war
  • 用户注销(从其他屏幕)时如何重置 TabNavigator

    这是我的项目文件层次结构 RootTabNavigator AuthStackNavigator I want to go back to this navigator AuthoScreen Welcome Screen MainTabN
  • 在 C++ 中将 32 位数字拆分为字节的最快方法

    我正在编写一段代码 旨在对 CLSID 结构进行一些数据压缩 我将它们存储为 128 位整数的压缩流 但是 相关代码必须能够将无效的 CLSID 放入流中 为了做到这一点 我把它们留作一根大绳子 在磁盘上 它看起来像这样 Length of
  • 在 WPF 中的 ListView 中填充 ComboBox

    I have populated a ComboBox inside a ListView Screen shot is given below 如上所示 它显示 M a c 而不是 Mac 为什么要将单词分成字符 在我写的文件后面的代码中
  • 带有后台页面的 Chrome 扩展程序无法与清单版本 2 配合使用

    我有一个简单的 Chrome 扩展 它在 Google Chrome 中显示一个小图标 单击后 它会加载我网站的搜索页面 这会将您重定向到正确的页面 https chrome google com webstore detail w3pat
  • Vue2:将函数作为 prop 传递会触发 prop 已设置的警告

    我是 Vue 新手 到目前为止我很喜欢单文件组件 在制作我真正想做的东西之前 我想我会尝试一些小事情来看看我是否掌握了这个概念 因此 我开始制作一个用于打开 XMLHttpRequest 的组件 并带有进度条