用 vue 实现用户跳转页面,如果当前页面里的 manaco 编辑器有未保存的内容,给用户提示是否需要保存当前编辑器内容
时间: 2024-09-28 17:06:21 浏览: 47
在 Vue 中实现这样的功能,可以结合Vuex(状态管理库)和自定义事件或者 Promises 来处理。首先,你需要在 Vuex store 中设置一个状态来跟踪 Manaco 编辑器的状态,比如 `isEditing` 和 `unsavedContent`。
```javascript
// store/modules/manaco.js
export const state = () => ({
isEditing: false,
unsavedContent: ''
});
export const mutations = {
setIsEditing(state, value) {
state.isEditing = value;
},
setUnsavedContent(state, content) {
state.unsavedContent = content;
}
};
export const actions = {
saveContent({ commit }, content) {
// 模拟保存逻辑,实际应用中这应该会触发真正的保存操作
if (content !== '') {
commit('setIsEditing', false);
commit('setUnsavedContent', '');
} else {
commit('setIsEditing', false);
}
},
checkAndSave({ getters }) {
if (getters.isEditing && getters.unsavedContent) {
return new Promise((resolve, reject) => {
// 弹出确认框,询问用户是否保存
const confirmSave = confirm('您有未保存的内容,确定离开吗?');
if (confirmSave) {
resolve();
} else {
reject();
}
});
}
return Promise.resolve();
}
};
```
然后在组件中监听编辑器的变化,并在切换页面前调用 `checkAndSave` 行为:
```vue
<template>
<ManacoEditor v-model="manacoContent" @change="updateContent"></ManacoEditor>
</template>
<script>
import { mapActions, mapState } from 'vuex';
export default {
data() {
return {
manacoContent: '',
};
},
computed: {
...mapState(['isEditing', 'unsavedContent']),
},
methods: {
updateContent(newContent) {
this.manacoContent = newContent;
this.$store.commit('setUnsavedContent', newContent);
},
navigate(nextPath) {
this.$store.dispatch('checkAndSave')
.then(() => {
// 如果用户选择保存,则正常跳转
this.$router.push(nextPath);
})
.catch(() => {
// 用户选择放弃保存,取消跳转或者弹窗告知无法离开
});
},
},
};
</script>
```
当用户试图离开含有未保存内容的页面时,会弹出提示询问他们是否保存。如果选择保存则跳转,否则阻止跳转。注意,这里的示例是一个简化的版,实际项目中可能还需要处理更多细节,比如错误处理和改进用户体验等。
阅读全文