Skip to content

Commit f818b8b

Browse files
committed
fix: watch newTodoTitle in CreateTodoForm.vue
1 parent 94f0bd1 commit f818b8b

File tree

2 files changed

+42
-14
lines changed

2 files changed

+42
-14
lines changed

src/components/CreateTodoForm.vue

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,53 @@
11
<template>
2-
<form @submit.prevent="onSubmit">
2+
<form @submit.prevent="handleSubmitNewTodo">
33
<input
44
type="text"
55
placeholder="Add new todo"
66
required
77
class="form-control px-5 py-4"
8-
v-model.trim="title"
8+
v-model.trim="state.title"
99
/>
1010
</form>
1111
</template>
1212

1313
<script lang="ts">
14-
import { defineComponent, PropType, Ref, ref } from "vue";
14+
import { defineComponent, PropType, reactive, watch } from "vue";
1515
16-
export type HandleSubmitNewTodo = (title: Ref<string>) => void;
16+
export type HandleSubmitNewTodo = () => void;
17+
18+
type State = {
19+
title: string;
20+
};
1721
1822
export default defineComponent({
1923
props: {
24+
newTodoTitle: {
25+
type: String as PropType<string>,
26+
required: true
27+
},
2028
handleSubmitNewTodo: {
2129
type: Function as PropType<HandleSubmitNewTodo>,
2230
required: true
2331
}
2432
},
2533
26-
setup(props) {
27-
const title: Ref<string> = ref("");
28-
const onSubmit = () => {
29-
props.handleSubmitNewTodo(title);
30-
};
31-
return { title, onSubmit };
34+
emits: ["update:newTodoTitle"],
35+
36+
setup(props, context) {
37+
const state = reactive<State>({ title: props.newTodoTitle });
38+
watch(
39+
() => props.newTodoTitle,
40+
newValue => {
41+
state.title = newValue;
42+
}
43+
);
44+
watch(
45+
() => state.title,
46+
newValue => {
47+
context.emit("update:newTodoTitle", newValue);
48+
}
49+
);
50+
return { state };
3251
}
3352
});
3453
</script>

src/pages/Index.vue

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<div class="container" style="width: 480px">
33
<CreateTodoForm
44
class="my-3"
5+
v-model:new-todo-title="state.newTodoTitle"
56
:handle-submit-new-todo="handleSubmitNewTodo"
67
/>
78
<TodoList
@@ -17,7 +18,7 @@
1718
</template>
1819

1920
<script lang="ts">
20-
import { defineComponent, Ref, ref } from "vue";
21+
import { defineComponent, reactive, Ref, ref } from "vue";
2122
import CreateTodoForm from "@/components/CreateTodoForm.vue";
2223
import TodoList from "@/components/TodoList.vue";
2324
import useTodos from "@/composables/use-todos";
@@ -33,15 +34,22 @@ import type {
3334
HandleSubmitEditedTodo,
3435
} from "@/components/EditTodoForm.vue";
3536
37+
type State = {
38+
newTodoTitle: string,
39+
}
40+
3641
export default defineComponent({
3742
components: { CreateTodoForm, TodoList },
3843
3944
setup() {
4045
const { todos, createTodo, updateTodo, removeTodo } = useTodos();
46+
const state = reactive<State>({
47+
newTodoTitle: ''
48+
})
4149
42-
const handleSubmitNewTodo: HandleSubmitNewTodo = (title) => {
43-
createTodo({ title: title.value, completed: false });
44-
title.value = "";
50+
const handleSubmitNewTodo: HandleSubmitNewTodo = () => {
51+
createTodo({ title: state.newTodoTitle, completed: false });
52+
state.newTodoTitle = "";
4553
};
4654
4755
const todoIdBeingEdited: Ref<string | null> = ref(null);
@@ -66,6 +74,7 @@ export default defineComponent({
6674
};
6775
6876
return {
77+
state,
6978
handleSubmitNewTodo,
7079
7180
todos,

0 commit comments

Comments
 (0)