如何在 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 -> app.vue
中设置新的发射,就像使用 task.vue -> 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 重新加载持久布局或观看道具