解决vue中拿不到第一次数据,只能从第二次拿的情况

this.$nextTick

第一种情况:

页面改变了,但是数据没有改变,我们使用的是this.$nextTick,官网是这样解释的:将回调延迟到下次DOM更新循环之后执行。在修改数据之后立即使用它,然后等待DOM更新。我们通过案例来了解:
<template>
  <div id="app">
    <button @click="change">按钮</button>
    <test ref="test" @change="change" /> 
  </div>
</template>

<script>
import test from "./components/test";
export default {
  name: "App",
    components: {
    test,
  },
  methods: {
    change() {
    this.$refs.test.change()
    },
  },
};
</script>
<template>
  <div>
    <h1 ref="name">{{name}}</h1>
  </div>
</template>
<script>
export default {
  name: "test",
  data() {
    return {
      name: "杨雨",
    };
  },
  methods: {
    change() {
      this.name = "杨雪";
       console.log(this.$refs.name.innerHTML)
    },
  },
};
当我们点击按钮,我们会触发子组件的change事件,修改name,同时我们输出一下此时子组件dom上渲染的name,由于此时dom还没更新,所以我们第一次拿到的结果是这样的:
效果:

11

页面数据虽然改变了,但是拿到的dom数据还没改变,所以我们需要将输出延迟到dom重新渲染之后,也就是将回调延迟到下次DOM更新循环之后执行,解决办法:
  methods: {
    change() {
      this.name = "杨雪";
      this.$nextTick(()=>{
          console.log(this.$refs.name.innerHTML)
      })
    },
  },

效果:

11

我记得我当时用到这个是在整组件库时,switch组件中用到的,好像在整element的table表格时,传数据也用到了,当时就是拿到的数据总是第二次穿的数据,包括现在我遇到这种情况,先整一个this.$nextTick试试,但是下面这个情况我用这种方法没有解决

setTimeout

第二种情况:

场景:我在做yy论坛时,请求数据里边有id,content...在列表页放title,点击title,把这个item放到vuex里边,进入详情页,但是这就会出现一个问题,一刷新就没有数据了,所以我干脆存到localStorage里边,取的时候总是为null,所以我捋了一边思路,当我一点击title,就会把content放到浏览器本地存储里边,与此同时,我会进入详情页,在这从浏览器本地存储里边拿数据,但是为什么为null呢?在网上没有找到好的解释,我猜是这样的,肯定是先存数据再拿数据,我们拿到是null,说明我们的操作是先拿再存的,所以我们需要延迟拿的操作,用了setTimeout,解决了,有知道这是为什么的,可以一起讨论
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
对于在Vue出现的此问题,可以尝试以下解决方案: 1. 使用 `scrollIntoView` 方法:在输入框聚焦时,使用JavaScript的 `scrollIntoView` 方法将页面滚动到输入框的位置,确保输入框不被软键盘遮挡。 例如,在输入框的 `@focus` 事件添加以下代码: ```html <input @focus="scrollToInput" /> ... methods: { scrollToInput() { const input = document.getElementById('your-input-id'); input.scrollIntoView(); } } ``` 2. 使用 `window.innerHeight` 监听窗口高度变化:在Vue组件的 `mounted` 生命周期钩子函数,使用 `window.innerHeight` 获取窗口高度,并在窗口高度变化时触发重新计算。 ```html <template> <div ref="container"> <input @focus="adjustInputPosition" /> </div> </template> <script> export default { mounted() { window.addEventListener('resize', this.adjustInputPosition); }, destroyed() { window.removeEventListener('resize', this.adjustInputPosition); }, methods: { adjustInputPosition() { const container = this.$refs.container; const input = container.querySelector('input'); if (input) { const windowHeight = window.innerHeight; const inputBottom = input.getBoundingClientRect().bottom; if (inputBottom > windowHeight) { container.style.transform = `translateY(-${inputBottom - windowHeight}px)`; } else { container.style.transform = 'translateY(0)'; } } } } } </script> ``` 这些解决方案可以确保在聚焦输入框时,软键盘不会遮挡输入框。根据你的具体情况,选择适合你的解决方案即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值