Skip to content

Commit af85629

Browse files
committed
feat: 优化代码结构,修复偏好重置不生效的问题
1 parent b18b495 commit af85629

File tree

3 files changed

+62
-50
lines changed

3 files changed

+62
-50
lines changed

frontend/src/App.vue

Lines changed: 5 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
ref="editorRef"
1414
:path="item.path"
1515
:like="like"
16-
@like="() => (open = !open)"
16+
@like="() => (likeOpen = true)"
1717
@diff="(v) => (item.diff = v)"
1818
/>
1919
</el-tab-pane>
@@ -36,61 +36,20 @@
3636
保存
3737
</el-button>
3838

39-
<el-dialog v-model="open" title="偏好设置" width="300">
40-
<div class="like-dialog">
41-
<div class="item">
42-
<div class="label">保存确认</div>
43-
<div class="value">
44-
<el-switch v-model="like.confirm" inline-prompt />
45-
</div>
46-
</div>
47-
48-
<div class="item">
49-
<div class="label">主题样式</div>
50-
<div class="value">
51-
<el-select v-model="like.theme" size="small">
52-
<el-option
53-
v-for="item in THEME_OPTIONS"
54-
:key="item.value"
55-
:label="item.label"
56-
:value="item.value"
57-
/>
58-
</el-select>
59-
</div>
60-
</div>
61-
62-
<div class="item">
63-
<div class="label">字体大小</div>
64-
<div class="value">
65-
<el-input-number v-model="like.fontSize" :min="8" :max="100" size="small" />
66-
</div>
67-
</div>
68-
</div>
69-
70-
<template #footer>
71-
<div style="display: flex; align-items: center; margin-top: 32px">
72-
<el-button size="small" type="danger" @click="resetLike()">恢复默认</el-button>
73-
74-
<div style="flex: 1"></div>
75-
76-
<div style="font-size: 12px; color: #999">修改实时生效,且进行缓存</div>
77-
</div>
78-
</template>
79-
</el-dialog>
39+
<LikeDialog v-model:open="likeOpen" v-model:like="like" @reset="resetLike()" />
8040
</template>
8141

8242
<script setup lang="ts">
8343
import { ref } from 'vue'
8444
import { Plus } from '@element-plus/icons-vue'
8545
86-
import MonacoEditor from './components/MonacoEditor.vue'
87-
88-
import { THEME_OPTIONS } from '@/utils/option'
46+
import MonacoEditor from '@/components/MonacoEditor.vue'
47+
import LikeDialog from '@/components/LikeDialog.vue'
8948
9049
import useLike from '@/hooks/useLike'
9150
import usePath from '@/hooks/usePath'
9251
93-
const { open, like, resetLike } = useLike()
52+
const { open: likeOpen, like, resetLike } = useLike()
9453
const { view, active, add, remove } = usePath()
9554
9655
const editorRef = ref<any[]>([])
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<template>
2+
<el-dialog v-model="open" title="偏好设置" width="300">
3+
<div class="like-dialog" v-if="like">
4+
<div class="item">
5+
<div class="label">保存确认</div>
6+
<div class="value">
7+
<el-switch v-model="like.confirm" inline-prompt />
8+
</div>
9+
</div>
10+
11+
<div class="item">
12+
<div class="label">主题样式</div>
13+
<div class="value">
14+
<el-select v-model="like.theme" size="small">
15+
<el-option
16+
v-for="item in THEME_OPTIONS"
17+
:key="item.value"
18+
:label="item.label"
19+
:value="item.value"
20+
/>
21+
</el-select>
22+
</div>
23+
</div>
24+
25+
<div class="item">
26+
<div class="label">字体大小</div>
27+
<div class="value">
28+
<el-input-number v-model="like.fontSize" :min="8" :max="100" size="small" />
29+
</div>
30+
</div>
31+
</div>
32+
33+
<template #footer>
34+
<div style="display: flex; align-items: center; margin-top: 32px">
35+
<el-button size="small" type="danger" @click="emit('reset')">恢复默认</el-button>
36+
37+
<div style="flex: 1"></div>
38+
39+
<div style="font-size: 12px; color: #999">修改实时生效,且进行缓存</div>
40+
</div>
41+
</template>
42+
</el-dialog>
43+
</template>
44+
45+
<script lang="ts" setup>
46+
import { THEME_OPTIONS } from '@/utils/option'
47+
48+
import { type LikeModel } from '@/hooks/useLike'
49+
50+
const emit = defineEmits<{ (e: 'reset'): void }>()
51+
52+
const open = defineModel('open')
53+
54+
const like = defineModel<LikeModel>('like')
55+
</script>

frontend/src/hooks/useLike.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { onMounted, reactive, ref, toRaw, watch, watchEffect } from 'vue'
1+
import { reactive, ref, toRaw, watch, watchEffect } from 'vue'
22

33
import localStorage from '@/utils/localStorage'
44
import { THEME_OPTIONS } from '@/utils/option'
@@ -20,7 +20,7 @@ const key = 'like_v1'
2020
export default function useCode() {
2121
const open = ref(false)
2222

23-
const like = reactive<LikeModel>(Object.assign(defLike, localStorage.get(key)))
23+
const like = reactive<LikeModel>(Object.assign({}, defLike, localStorage.get(key)))
2424

2525
watch(like, () => {
2626
localStorage.set(key, toRaw(like))
@@ -35,7 +35,5 @@ export default function useCode() {
3535
Object.assign(like, { ...defLike })
3636
}
3737

38-
onMounted(() => {})
39-
4038
return { open, like, resetLike }
4139
}

0 commit comments

Comments
 (0)