如何在 vue js 中发送带有道具的方法?我在组件中有 2 种方法,但其中一种方法不起作用?

Posted

技术标签:

【中文标题】如何在 vue js 中发送带有道具的方法?我在组件中有 2 种方法,但其中一种方法不起作用?【英文标题】:how can i send methods with props in vue js? i have 2 methods in components but one of them didnt work? 【发布时间】:2021-08-10 09:16:21 【问题描述】:

嗨,朋友,我有一个问题。 我想用 Vue 创建待办事项列表应用程序,我现在有 3 个组件: 任务组件在任务组件中应用程序组件(任务是任务的子任务和应用程序的子任务)

我想处理删除这个任务并设置提醒这个任务 我有一个任务数组,其中包含一些从 app.vue 传递到任务组件的对象 我在具有布尔值的任务对象中具有提醒属性


我想用 handleDelete 删除任务,但是这个函数有错误 但 当我在应用程序组件中编写此功能时,它可以工作! 并在已完成的任务中设置提醒!

为什么handleDelete 在任务组件中不起作用,而setReminder 在其中起作用?

我的应用组件:

        <template>
      <div class="container">
        <Header title="write your task" />
        <Tasks :tasks="tasks" />
      </div>
    </template>
    
    <script>
    import Header from "./components/Header";
    import Tasks from "./components/Tasks";
    export default 
      name: "App",
      components: 
        Header,
        Tasks,
      ,
      data() 
        return 
          tasks: [],
        ;
      ,
      methods: 
       
      ,
      created() 
        this.tasks = [
          
            id: 1,
            text: "do project",
            day: "march 3rd at 1pm",
            reminder: true,
          ,
          
            id: 2,
            text: "rest",
            day: "march 3rd at 1pm",
            reminder: false,
          ,
          
            id: 3,
            text: "sleep",
            day: "march 3rd at 1pm",
            reminder: true,
          ,
          
            id: 4,
            text: "running",
            day: "march 3rd at 1pm",
            reminder: true,
          ,
          
            id: 5,
            text: "do homework",
            day: "march 3rd at 1pm",
            reminder: true,
          ,
          
            id: 6,
            text: "go home",
            day: "january 3rd at 1pm",
            reminder: false,
          ,
        ];
      ,
    ;
    </script>

我的任务组件是:

<template>
  <div v-for="task in tasks" :key="task.id">
    <Task :task="task" :tasks="tasks" 
    @DeleteTask="handleDeleteTask" 
    @toggle-reminder ="setReminder"
    />
  </div>
</template>

<script>
import Task from "./Task";

export default 
  name: "Tasks",
  props: 
    tasks: Array,
  ,
  components: 
    Task,
  ,
  methods: 
 handleDeleteTask(id) 
      console.log(this.tasks);
      this.tasks = this.tasks.filter((i) => i.id !== id);
      console.log(this.tasks);
    ,
    setReminder(id) 
      const index = this.tasks.findIndex((task) => task.id === id);
      console.log(this.tasks[index].reminder);
      this.tasks[index].reminder = !this.tasks[index].reminder;
      console.log(this.tasks[index].reminder);
    ,
  ,
;
</script>

一个任务组件是:

<template>
  <div
    :class="[task.reminder ? 'reminder' : '', 'task']"
    @dblclick="$emit('toggle-reminder' , task.id)"
  >
    <h3>
       task.text 
      <i class="fas fa-times" @click="this.$emit('DeleteTask', id);"></i>
    </h3>
    <p> task.day </p>
  </div>
</template>

<script>
export default 
  name: "Task",
  props: 
    task: Object,
    tasks: Array,
  ,


;
</script>

【问题讨论】:

【参考方案1】:

task.id

这里你直接传递 id 应该是 task.id

//From
<i class="fas fa-times" @click="this.$emit('DeleteTask', id);"></i>
//To
<i class="fas fa-times" @click="this.$emit('DeleteTask', task.id);"></i>

没有道具突变

您不应该更改 prop 值,不应该修改 prop 传递的任何变量,它是父组件中原始变量的图像,您应该在 tasks.vue -&gt; app.vue 中设置新的发射,就像使用 task.vue -&gt; tasks.vue 一样

检查这个工作sandbox

命名约定

浏览器会对@DeleteTask(任务组件中的事件侦听器)感到困惑,并且不会将其链接到事件,因为它对他来说是@deletetask

您已经在 kebab-case 中命名了另一个,这就是它起作用的原因

改变 @click="this.$emit('DeleteTask', id);"@click="this.$emit('delete-task', id);"@DeleteTask@delete-task;

Vue 文档中的命名约定说总是用 烤肉串盒。原因是当 Vue 编译它的 html 时, HTML 不区分大小写字母

【讨论】:

检查链接,我解释了所有可能的问题

以上是关于如何在 vue js 中发送带有道具的方法?我在组件中有 2 种方法,但其中一种方法不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

将 Vue.JS 道具发送到 JavaScript 函数时出现问题

如何使用 Inertia Js、Vue 和 Laravel 重新加载持久布局或观看道具

带有 Vue js 道具的反应式 Tailwind 类

道具被变异(在 django 模板和带有 CDN 的 Vue.js 中)

如何在组件的方法中访问 Vue JS 道具?

Vue.js 缺少必需的道具