vue3从接口拿到数据赋值失去响应式的问题

都知道vue3的优点就是响应式数据。因此我们在开发的时候,就会遇到一个问题,我从后端拿到数据后,再赋值的时候,会看到接口的数据并没有运用在页面上。

let detailsObj = reactive({})
function detailsAccount() {
  detailsAccountApi(props.record.id)
    .then((res) => {
      detailsObj = res.data //直接赋值
    })
    .catch((err) => {
      console.log(err)
    })
}

这样写就会使数据丢失了响应性。主要就是vue3的reactive重新赋值无效

再来看下面这两张图:

let detialsRulesForm = ref<any>({}) 
let detialsRulesForm2 = reactive({})
//赋值
detialsRulesForm.value = res.data
detialsRulesForm2 = res.data
//打印
console.log(detialsRulesForm.value, 'detialsRulesForm.value')
console.log(detialsRulesForm2, 'detialsRulesForm2')

通过这两张图片,我们可以看到使用ref()来赋值的数据前面有proxy,是响应式的数据,而使用reactive({})则就是单纯的数据,因为vue3使用proxy,所以对于对象和数组都不能直接整个赋值。

正确的写法应该是

第一种:使用ref()来实现,也是比较简单方便的。

let detialsRulesForm = ref<any>({}) 
detialsRulesForm = res.data

第二种:还是使用reative来实现,但是我们在reative里面在写一个对象,用obj来装后端拿的数据。

 let detialsRulesForm = reactive<any>({
    obj: {}
  }) 
detialsRulesForm.obj = res.data

第三种:通过遍历来实现响应式数据,我个人是不太喜欢第三种的,代码量有点多余。

let detailsObj = reactive({})
res.data.forEach((item) => {
  detialsRulesForm.push(item)
})

以上就是我在开发过程中遇到的问题和解决方法,我个人认为除了第三种不太推荐,其他两种都可以。

### 解决 Cursor 错误请求被阻止问题 当遇到 `cursor error` 并提示由于可疑活动而导致请求被阻止的情况时,通常是因为服务器检测到异常行为并采取了安全措施。以下是可能的原因以及解决方案: #### 可能原因分析 1. **IP 地址被列入黑名单** 如果客户端的 IP 被认为存在恶意行为,则可能会触发服务器的安全机制,从而导致请求被拒绝[^1]。 2. **频繁访问或超出速率限制** 过多的 API 请求可能导致服务器将其视为潜在威胁,并暂时封锁该连接[^2]。 3. **不合法的身份验证令牌** 使用过期或者伪造的身份验证令牌也可能引发此类错误消息[^3]。 4. **浏览器插件干扰** 某些广告拦截器或其他扩展程序可能会影响正常的网络通信过程,进而造成类似的错误现象[^4]。 5. **数据库游标超时设置不当** 对于某些应用而言,“cursor”指代的是数据库查询中的游标对象;如果长时间未操作而使得会话断开,则同样会出现上述状况[^5]。 #### 针对性解决办法 - **确认当前使用的 IP 是否正常** 尝试更换不同的网络环境重新发起尝试,观察是否有改善效果。 - **调整请求频率至合理范围之内** 查阅目标服务文档了解其允许的最大 QPS (Queries Per Second),据此优化自己的调用逻辑以满足规定条件。 - **更新认证凭证** 确认所依赖的所有授权信息均处于有效期内,并按照官方指南完成必要的刷新流程。 - **禁用第三方软件影响因素** 测试期间可以考虑临时关闭那些已安装但不确定作用的附加组件来排除它们带来的副作用。 - **适当延长 cursor 的存活周期** 根据实际需求修改相关参数配置文件里的 timeout 值,给予更充裕的时间窗口处理数据读取任务。 ```javascript // 示例代码展示如何通过 MongoDB 设置更大的批处理大小和增加生存时间 const MongoClient = require(&#39;mongodb&#39;).MongoClient; let client; async function main() { const uri = &#39;your_connection_string&#39;; client = new MongoClient(uri, { useNewUrlParser: true }); await client.connect(); const collection = client.db("test").collection("accounts"); let cursor = collection.find().batchSize(10).noCursorTimeout(true); } main() .then(() => console.log("Operation completed")) .catch(err => console.error(`An error occurred while running the script: ${err}`)) .finally(() => client.close()); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值