当前位置:   article > 正文

vue3+node(koa2)写一个网站(一)-前端篇_node koa写前端页面

node koa写前端页面

vue 3文档

采用vue-cli 4.5.0生成项目目录。项目中采用vue3的新语法来写代码,当然你还是用原来的vue 2.x语法也不会有问题。

新版本的脚手架生成的项目 main.js与之前旧版本略有不同,新版本如下:

  1. //main.js
  2. import { createApp } from 'vue';
  3. import App from './App.vue';
  4. import router from './router';
  5. // 法一
  6. const app = createApp(App);
  7. app.use(router)
  8. app.mount('#app')
  9. //法二
  10. //createApp(App).use(router).mount('#app')

新版本中路由的使用方式也不太一样:

  1. // router/index.js
  2. import { createRouter, createWebHashHistory } from 'vue-router';
  3. import Home from '@/views/Home'
  4. const router = createRouter({
  5. history: createWebHashHistory(),
  6. routes: [
  7. {
  8. path: '',
  9. redirect: '/home'
  10. },
  11. {
  12. path: '/home',
  13. name: 'home',
  14. component: Home
  15. }
  16. ]
  17. });
  18. export default router;
  19. //页面中监听路由和使用路由的变化
  20. import { watch } from "vue";
  21. import { useRoute, useRouter } from "vue-router";
  22. export default {
  23. name: "my-header",
  24. setup() {
  25. const route = useRoute();
  26. const router = useRouter();
  27. const activeRoute = ref("");
  28. watch(
  29. () => route.path,
  30. (curPath) => {
  31. activeRoute.value = curPath;
  32. }
  33. )
  34. function toPage(path) {
  35. router.push(path);
  36. }
  37. return {
  38. activeRoute,
  39. toPage
  40. };
  41. }
  42. };

vue3一个比较大的亮点就是composition api, 之前选项的写法只能数据写一块,处理逻辑写一块,维护起来效率不高。现在通过新语法,某个功能的数据和逻辑能封装到一块 维护性、复用性得到大大提高。 别说 用起来还真香。

  1. // blog.js
  2. //获取博客相关的数据和逻辑封装到一起
  3. import { ref } from "vue";
  4. import { getBlogList } from "@/api/blog";
  5. import { formatTime } from "@/utils";
  6. export function getBlogListLogic() {
  7. const blogList = ref([]);
  8. async function getBlog(keyword) {
  9. const {
  10. data: { data, errno }
  11. } = await getBlogList({ keyword: keyword && keyword.value });
  12. if (errno === 0) {
  13. data.forEach(item => {
  14. item.createtime = formatTime(item.createtime);
  15. });
  16. blogList.value = data;
  17. }
  18. }
  19. return { blogList, getBlog };
  20. }
  1. //页面中使用示例
  2. import { ref, onMounted } from "vue";
  3. import { useRouter } from "vue-router";
  4. import { getBlogListLogic } from "@/common/blog";
  5. export default {
  6. name: "Home",
  7. setup() {
  8. const keyword = ref("");
  9. const router = useRouter();
  10. const { blogList, getBlog } = getBlogListLogic();
  11. function onSearch(key) {
  12. keyword.value = key;
  13. getBlog(keyword);
  14. }
  15. function toDetail(blog) {
  16. router.push({
  17. path: "/blog/detail",
  18. query: {
  19. id: blog.id
  20. }
  21. });
  22. }
  23. onMounted(() => {
  24. getBlog();
  25. });
  26. return {
  27. blogList,
  28. keyword,
  29. onSearch,
  30. toDetail
  31. };
  32. }
  33. };

有时候我们需要通过ref来获取元素或自定义组件的引用,在vue3语法中使用方式也不太一样了。

  1. //xxx.vue
  2. <template>
  3. <div class="content-wrap">
  4. <quill-editor
  5. :ref="q => quill = q"
  6. :value="postData.content"
  7. ></quill-editor>
  8. </div>
  9. </template>
  10. <script>
  11. import QuillEditor from "@/components/QuillEditor";
  12. import { ref, reactive } from "vue";
  13. export default {
  14. name: "handleblog",
  15. components: {
  16. QuillEditor
  17. },
  18. setup() {
  19. const quill = ref(null);
  20. const postData = reactive({
  21. description: "",
  22. title: "",
  23. content: ""
  24. });
  25. async function onSaveClick() {
  26. //通过ref调用quill-eidtor组件中的getContent方法
  27. postData.content = quill.value.getContent();
  28. }
  29. return {
  30. quill,
  31. postData,
  32. onSaveClick
  33. };
  34. }
  35. };
  36. </script>

setup函数也接受两个参数 props 和 context。 props是响应式的,context是普通的js对象包含3个属性 attrs, slots, emit。

  1. export default {
  2. setup(props, context) {
  3. ...
  4. }
  5. }
  6. export default {
  7. setup(props, { attrs, slots, emit }) {
  8. //向外触发事件
  9. emit('change')
  10. }
  11. }

登录的处理。有些页面我门需要登录后才让访问,可以在路由导航守卫进行拦截判断是否登录,如果需要登录权限但没登录就去登录。接口报401的时候让跳转到登录页。

  1. //router/index.js
  2. router.beforeEach((to, from, next) => {
  3. //因为如果登录了,服务端代码会加上cookie,所以可以通过有没有cookies来判断是否已登录
  4. if (to.meta.needLogin && !getCookie('koa.sid')) {
  5. next('/login')
  6. } else {
  7. next()
  8. }
  9. })
  1. //axios封装处
  2. import Axios from 'axios';
  3. import router from '@/router/index';
  4. import { message } from 'ant-design-vue';
  5. const fetch = Axios.create({
  6. baseURL: ''
  7. });
  8. fetch.interceptors.request.use(function (config) {
  9. return config;
  10. }, function (error) {
  11. return Promise.reject(error);
  12. });
  13. // 添加响应拦截器
  14. fetch.interceptors.response.use(function (response) {
  15. return response;
  16. }, function (error) {
  17. const { status, data } = error.response;
  18. switch (status) {
  19. case 401:
  20. message.warn(data.message)
  21. router.push('/login');
  22. break;
  23. default:
  24. message.error(data.message)
  25. return Promise.reject(data);
  26. }
  27. });
  28. export default fetch;

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/355501
推荐阅读
相关标签
  

闽ICP备14008679号