我使用的是Vue3组合API.基本上,我try 从存储在本地存储中的对象获取数据,但我总是收到未定义的数据,即使它确实100%存在.

错误是:"Uncaught (in promise) TypeError: $setup.habits.value is undefined"

我的本地存储对象:habits:"[{"habitName":"Dance","completedDates":["2023-12-27","2023-12-26","2023-12-28"]},{"habitName":"Act","completedDates":["2023-12-28"]}]"

引用从本地存储获取项目的习惯变量.以下是我的组件:

import { ref, nextTick, watchEffect } from 'vue'
import AddHabit from '../components/EditHabits/AddHabit.vue'


let habits = ref(JSON.parse(localStorage.getItem('habits')))

let editingHabit = ref()

watchEffect(() => {
    habits.value = JSON.parse(localStorage.getItem('habits'))
})

const editHabit = async (habit) => {
    editingHabit.value = habit

    await nextTick()
    const inputField = document.getElementById(habit.habitName)
    inputField.focus()
    inputField.addEventListener('keydown', (event) => {
        if (event.key === 'Enter') {
            const index = habits.value.findIndex(h => h.habitName === habit.habitName) 
            
            habits.value[index].habitName = editingHabit.value.habitName
            localStorage.setItem('habits', JSON.stringify(habits.value))
            
            editingHabit.value = null
            
        }
    })
}


</script>

<template>
    <div>
        <h4>Your Current Habits: </h4>
        <div id="total-habits" v-if="habits.value.length">
            <div class="dropdown" v-for="habit in habits.value" :key="habit.habitName">
                <p id="habitEntry" v-if="editingHabit.value !== habit"> {{ habit.habitName }}</p>
                <input :id="habit.habitName" v-else v-model.lazy="editingHabit.value.habitName" type="text">                
                <div class="dropdown-content">
                    <div @click="editHabit(habit)">Edit</div>
                    <div>Pause</div>
                    <div>Delete</div>
                </div>
            </div>
            
        </div>
        <div v-else>No Habits Yet!</div>
        
        
        <h4>Hover on a habit to edit it!</h4>
    </div>
    
    <AddHabit/>
</template>```

推荐答案

在模板中使用vue3,为了读取或修改您的变量,您只需调用它,而不是调用.value,这与脚本部分不同

所以<div v-if="habits.value.length" id="total-habits">变成了<div v-if="habits.length" id="total-habits">.

只需进行此修改,您就应该能够清除代码. 以下是您的代码,但已修改:

<script setup>
import {
  nextTick,
  ref,
  watchEffect
} from 'vue'

const habits = ref([])
const editingHabit = ref({})

watchEffect(() => {
  habits.value = JSON.parse(localStorage.getItem('habits'))
})

const editHabit = async (habit) => {
  editingHabit.value = habit

  await nextTick()
  const inputField = document.getElementById(habit.habitName)
  inputField.focus()
  inputField.addEventListener('keydown', (event) => {
    if (event.key === 'Enter') {
      const index = habits.value.findIndex(h => h.habitName === habit.habitName)

      habits.value[index].habitName = editingHabit.value.habitName
      localStorage.setItem('habits', JSON.stringify(habits.value))

      editingHabit.value = null
    }
  })
}
</script>

<template>
  <div>
    <h4>Your Current Habits: </h4>
    <div v-if="habits.length" id="total-habits">
      <div v-for="habit in habits" :key="habit.habitName" class="dropdown">
        <p v-if="editingHabit !== habit" id="habitEntry"> {{ habit.habitName }}</p>
        <input v-else :id="habit.habitName" v-model.lazy="editingHabit.habitName" type="text">
        <div class="dropdown-content">
          <div @click="editHabit(habit)">Edit</div>
          <div>Pause</div>
          <div>Delete</div>
        </div>
      </div>

    </div>
    <div v-else>No Habits Yet!</div>
    <h4>Hover on a habit to edit it!</h4>
  </div>

  <!--  <AddHabit/>-->
</template>

<style scoped>

</style>

更多信息:https://vuejs.org/guide/essentials/reactivity-fundamentals.html

Javascript相关问答推荐

vanillajs-datepicker未设置输入值,日期单击时未触发更改事件

使用JavaScript单击上一个或下一个特定按钮创建卡滑动器以滑动单个卡

我试图实现用户验证的reduxstore 和操作中出了什么问题?

react/redux中的formData在expressjs中返回未定义的req.params.id

Plotly热图:在矩形上zoom 后将zoom 区域居中

react—router v6:路由没有路径

切换时排序对象数组,切换不起作用

将旋转的矩形zoom 到覆盖它所需的最小尺寸&S容器

为什么按钮会随浮动属性一起移动?

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

未定义引用错误:未定义&Quot;而不是&Quot;ReferenceError:在初始化&Quot;之前无法访问';a';

覆盖TypeScrip中的Lit-Element子类的属性类型

面对代码中的错误作为前端与后端的集成

如果一个字符串前面有点、空格或无字符串,后面有空格、连字符或无字符串,则匹配正则表达式

如何用javascript更改元素的宽度和高度?

在渲染turbo流之后滚动到元素

我无法在Api Reaction本机上发出GET请求

如何调整下拉内容,使其不与其他元素重叠?

使用jQuery每隔几秒钟突出显示列表中的不同单词

正在发出错误的URL请求