vue3을 사용하여 백엔드 시스템을 구축하는 방법
먼저 npm 또는 원사를 사용하여 vue 프로젝트를 만듭니다
// 使用npm创建一个基于vite构建的vue项目 npm create vite@latest // 使用yarn创建一个基于vite构建的vue项目 yarn create vite@latest
생성된 컴포지션에서 선택합니다.
vue vue-ts
생성 후 프로젝트를 컴파일러로 드래그하여 엽니다
1. vite 구성
vite.config에서 프로젝트를 구성합니다. .ts 파일 서비스 데이터는 다음과 같이 구성됩니다.
// 此处配置项目服务参数 server: { host: "0.0.0.0", // 项目运行地址,此处代表localhost port: 8888, // 项目运行端口 open: true, //编译之后是否自动打开页面 hmr: true, // 是否开启热加载 },
그런 다음 서버 아래에 src 별칭 @을 구성하면 구성은 다음과 같습니다.
// 配置src的别名@ resolve: { alias: { "@": resolve(__dirname, "./src"), }, },
또한 ts 구성 파일 tsconfig.json에 다음 구성을 추가해야 합니다. :
"baseUrl": "./", // 配置路径解析的起点 "paths": { // 配置src别名 "@/*": ["src/*"] // 当我们输入@/时会被映射成src/ }
2. 라우터 라우팅
1. 라우터 라우팅 설치
npm install vue-router@latest yarn add vue-router@latest
2. 라우터 라우팅 구성
src 아래에 새 라우터 폴더를 생성하고 index.ts를 생성한 후 다음과 같이 구성합니다
import { createRouter, createWebHistory, RouteRecordRaw} from 'vue-router'; import Layout from '@/components/HelloWorld.vue' // 定义路由,此处为Array数组,数据类型为RouteRecordRaw const routes: Array<RouteRecordRaw> = [ { path: '/home', name: 'home', component: Layout } ] // 创建路由 const router = createRouter({ history: createWebHistory(), routes // 将定义的路由传入 }) // 将创建的router路由暴露,使其在其他地方可以被引用 export default router
3. 라우터 라우팅 등록
'@/router/index'에서 main.ts 첫 번째 라우터에 가져오기를 전달합니다. 경로를 소개한 다음 다음과 같이 use 함수를 사용하여 경로를 등록합니다.
import { createApp } from 'vue' import './style.css' import App from './App.vue' // 此处引入定义的路由 import router from '@/router/index' // createApp(App).mount('#app') // 此处将链式创建拆解,从中注册路由 const app = createApp(App); // 注册路由 app.use(router) app.mount('#app')
<template>
<!-- <div>
<a href="https://vitejs.dev" rel="external nofollow" target="_blank">
<img class="logo lazy" src="/static/imghw/default1.png" data-src="/vite.svg" alt="Vite logo" />
</a>
<a href="https://vuejs.org/" rel="external nofollow" target="_blank">
<img class="logo vue lazy" src="/static/imghw/default1.png" data-src="@/assets/vue.svg" alt="Vue logo" />
</a>
</div> -->
<!-- 在App的入口程序使用路由,会将我们注册的路由全部引入到App入口,通过路由的路径确定跳转的页面 -->
<router-view></router-view>
</template>
# 选择一个你喜欢的包管理器
// 安装element-plus
npm install element-plus --save
yarn add element-plus
pnpm install element-plus
// 安装element-plus的图标库组件
npm install @element-plus/icons-vue
yarn add @element-plus/icons-vue
pnpm install @element-plus/icons-vue
로그인 후 복사
1. 요소 플러스 등록 및 아이콘 구성 라우터와 마찬가지로 main.ts에 있습니다. 등록 및 구성은 다음과 같습니다. # 选择一个你喜欢的包管理器 // 安装element-plus npm install element-plus --save yarn add element-plus pnpm install element-plus // 安装element-plus的图标库组件 npm install @element-plus/icons-vue yarn add @element-plus/icons-vue pnpm install @element-plus/icons-vue
import { createApp } from "vue"; import "./style.css"; import App from "./App.vue"; // 次数引入定义的路由 import router from "@/router/index"; // 引入element-plus import ElementPlus from "element-plus"; import "element-plus/dist/index.css"; // 引入element-plus的图标库 import * as ElementPlusIconsVue from "@element-plus/icons-vue"; // createApp(App).mount('#app') // 此处将链式创建拆解,从中注册路由 const app = createApp(App); // 注册路由、element-plus等 app.use(router).use(ElementPlus); // 将所有配置挂载到index.html的id为app的容器上 app.mount("#app"); // 此处参考官网,意为将图标库中的每个图标都注册成组件 for (const [key, component] of Object.entries(ElementPlusIconsVue)) { app.component(key, component); }
yarn add pinia
# 或者使用 npm
npm install pinia
로그인 후 복사
4. Test piniayarn add pinia # 或者使用 npm npm install pinia
// 从pinia中引入创建实例的函数 import { createPinia } from 'pinia' // 使用createPinia函数创建一个pinia实例并注册 app.use(createPinia())
// 从pinia中引入defineStore函数来定义store
import { defineStore } from "pinia";
// 定义一个store并取名为useStore
// defineStore第一个参数是应用程序中store的唯一标识,也就是在定义其他store时该标识不能相同
// 此处可以类比为java中的实体类,useStore就是类名,state里的属性是成员属性,getters里的函数是getter方法,actions里的函数是setter方法
export const useStore = defineStore("useStore", {
// 定义state
// 推荐使用 完整类型推断的箭头函数
state: () => {
return {
// 所有这些属性都将自动推断其类型
count: 0,
name: "Eduardo",
isAdmin: true,
};
},
// 定义getters,里面定义一些对state值的取值操作
// 指向箭头函数定义的时候所处的对象,而不是其所使用的时候所处的对象,默认指向父级的this
// 普通函数中的this指向它的调用者,如果没有调用者则默认指向window
getters: {
doubleCount: (state) => state.count * 2,
doubleCountOne(state) {
return state.count * 2;
},
doublePlusOne(): number {
return this.count * 2 + 1;
},
},
// 定义actions,里面定义一些对state的赋值操作
actions: {
setCounter(count:number){
this.count = count
}
}
});
// 1、只有一个参数的时候,参数可以不加小括号,没有参数或2个及以上参数的,必须加上小括号
// 2、返回语句只有一条的时候可以不写{}和return,会自动加上return的,返回多条语句时必须加上{}和return
// 3、箭头函数在返回对象的时候必须在对象外面加上小括号
// 在vue中定义函数时,我们尽量都指明函数返回值类型以及参数的数据类型
로그인 후 복사
그런 다음 src 아래에 레이아웃 폴더를 만들고 새 index.vue 파일을 만듭니다. 구성은 다음과 같습니다. 전체 el-container는 전체 레이아웃 레이아웃입니다. 레이아웃은 아래와 같습니다. 다양한 블록은 서로 다른 블록으로 구분되지만 요약하면 다음과 같이 나눌 수 있습니다. 1. 사이드 메뉴 표시줄 3. 콘텐츠 표시 영역 분할된 블록에는 다양한 구성과 처리가 포함됩니다. 따라서 전체 레이아웃에서 이러한 큰 블록을 구성 요소로 추출하여 코드를 더 쉽게 읽을 수 있도록 할 수 있습니다. 또한 추출된 각 블록 자체도 가능합니다. 나누어야 할 문제가 있습니다. 분할을 통해 복잡한 문제를 단순함으로 줄이고 쉽게 해결할 수 있습니다. // 从pinia中引入defineStore函数来定义store import { defineStore } from "pinia"; // 定义一个store并取名为useStore // defineStore第一个参数是应用程序中store的唯一标识,也就是在定义其他store时该标识不能相同 // 此处可以类比为java中的实体类,useStore就是类名,state里的属性是成员属性,getters里的函数是getter方法,actions里的函数是setter方法 export const useStore = defineStore("useStore", { // 定义state // 推荐使用 完整类型推断的箭头函数 state: () => { return { // 所有这些属性都将自动推断其类型 count: 0, name: "Eduardo", isAdmin: true, }; }, // 定义getters,里面定义一些对state值的取值操作 // 指向箭头函数定义的时候所处的对象,而不是其所使用的时候所处的对象,默认指向父级的this // 普通函数中的this指向它的调用者,如果没有调用者则默认指向window getters: { doubleCount: (state) => state.count * 2, doubleCountOne(state) { return state.count * 2; }, doublePlusOne(): number { return this.count * 2 + 1; }, }, // 定义actions,里面定义一些对state的赋值操作 actions: { setCounter(count:number){ this.count = count } } }); // 1、只有一个参数的时候,参数可以不加小括号,没有参数或2个及以上参数的,必须加上小括号 // 2、返回语句只有一条的时候可以不写{}和return,会自动加上return的,返回多条语句时必须加上{}和return // 3、箭头函数在返回对象的时候必须在对象外面加上小括号 // 在vue中定义函数时,我们尽量都指明函数返回值类型以及参数的数据类型
<template>
<!-- 测试element-plus -->
<el-button type="primary">Primary</el-button>
<!-- 测试element-plus图标 -->
<div >
<Edit />
<Share />
<Delete />
<Search />
</div>
<h3 id="方式一-直接通过store-count">方式一、直接通过store.count++</h3>
<!-- 测试pinia -->
<h4 id="直接从store取值并测试pinia-nbsp-count-nbsp">直接从store取值并测试pinia:{{ count }}</h4>
<el-button type="primary" @click="addCount">增加</el-button>
<h4 id="使用storeToRefs函数解析store后测试pinia-nbsp-count-nbsp">使用storeToRefs函数解析store后测试pinia:{{ count1 }}</h4>
<el-button type="primary" @click="addCount1">增加</el-button>
<h3 id="方式二-通过调用store中的函数">方式二、通过调用store中的函数</h3>
<h4 id="通过store中的函数并测试pinia-nbsp-count-nbsp">通过store中的函数并测试pinia:{{ count1 }}</h4>
<el-button type="primary" @click="addCount2">增加</el-button>
</template>
<script setup lang="ts">
import { useStore } from "@/store/index";
import { storeToRefs } from "pinia"; // 解析store中的数据,如成员属性、方法
// 创建了一个useStore实例对象
const store = useStore();
// 增加成员属性count的值,方式一、直接通过store.count++
// 拿到成员属性count,但这样取值会失去响应性,也就是不能实时同步,当我们点击增加按钮后,虽然操作已经完成,count也增加了,但展示有延迟
// 这个取值过程可能涉及解析数据,从而导致函数执行完后数据没有变化
const count = store.count;
const addCount = () => {
store.count++;
};
// 通过pinia中的storeToRefs函数将store中的数据都进行解析
const count1 = storeToRefs(store).count;
const addCount1 = () => {
store.count++;
};
// 方式二、通过调用store中的函数
const addCount2 = () => {
store.setCounter(++store.count)
};
</script>
<style scoped>
.read-the-docs {
color: #888;
}
</style>
로그인 후 복사
레이아웃 레이아웃에서 추출한 메뉴바 컴포넌트 : <template> <!-- 测试element-plus --> <el-button type="primary">Primary</el-button> <!-- 测试element-plus图标 --> <div > <Edit /> <Share /> <Delete /> <Search /> </div> <h3 id="方式一-直接通过store-count">方式一、直接通过store.count++</h3> <!-- 测试pinia --> <h4 id="直接从store取值并测试pinia-nbsp-count-nbsp">直接从store取值并测试pinia:{{ count }}</h4> <el-button type="primary" @click="addCount">增加</el-button> <h4 id="使用storeToRefs函数解析store后测试pinia-nbsp-count-nbsp">使用storeToRefs函数解析store后测试pinia:{{ count1 }}</h4> <el-button type="primary" @click="addCount1">增加</el-button> <h3 id="方式二-通过调用store中的函数">方式二、通过调用store中的函数</h3> <h4 id="通过store中的函数并测试pinia-nbsp-count-nbsp">通过store中的函数并测试pinia:{{ count1 }}</h4> <el-button type="primary" @click="addCount2">增加</el-button> </template> <script setup lang="ts"> import { useStore } from "@/store/index"; import { storeToRefs } from "pinia"; // 解析store中的数据,如成员属性、方法 // 创建了一个useStore实例对象 const store = useStore(); // 增加成员属性count的值,方式一、直接通过store.count++ // 拿到成员属性count,但这样取值会失去响应性,也就是不能实时同步,当我们点击增加按钮后,虽然操作已经完成,count也增加了,但展示有延迟 // 这个取值过程可能涉及解析数据,从而导致函数执行完后数据没有变化 const count = store.count; const addCount = () => { store.count++; }; // 通过pinia中的storeToRefs函数将store中的数据都进行解析 const count1 = storeToRefs(store).count; const addCount1 = () => { store.count++; }; // 方式二、通过调用store中的函数 const addCount2 = () => { store.setCounter(++store.count) }; </script> <style scoped> .read-the-docs { color: #888; } </style>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" rel="external nofollow" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Vue + TS</title>
</head>
<body>
<!-- 此处为程序的最终入口,会引入App.vue 并将相应的配置挂载到id为app <div id="app"></div> 上 -->
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
<!-- 这里对html、body、挂载容器div做样式的初始化设置,去除原有的设置 -->
<style lang="less">
html,body,#app {
padding: 0px;
margin: 0px;
height: 100%;
box-sizing: border-box;
}
#app {
width: 100%;
max-width: 100%;
}
</style>
로그인 후 복사
메뉴바에서 추출한 메뉴 아이템 컴포넌트 : <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <link rel="icon" type="image/svg+xml" href="/vite.svg" rel="external nofollow" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Vite + Vue + TS</title> </head> <body> <!-- 此处为程序的最终入口,会引入App.vue 并将相应的配置挂载到id为app <div id="app"></div> 上 --> <div id="app"></div> <script type="module" src="/src/main.ts"></script> </body> </html> <!-- 这里对html、body、挂载容器div做样式的初始化设置,去除原有的设置 --> <style lang="less"> html,body,#app { padding: 0px; margin: 0px; height: 100%; box-sizing: border-box; } #app { width: 100%; max-width: 100%; } </style>
<template> <el-container class="container"> <!-- layout布局左侧菜单区 --> <el-aside width="200px" class="aside"> <!-- 菜单项,通过组件的形式引入 --> <Menu></Menu> </el-aside> <!-- layout布局内容区 --> <el-container> <!-- 内容区头部 --> <el-header class="header"> <!-- 头部组件,抽离成组件形式 --> <Header></Header> </el-header> <!-- 内容区的主体,用于数据展示 --> <el-main class="content">Main</el-main> </el-container> </el-container> </template> <script setup lang="ts"> // vue3中组件引入后不需要使用conponents注册,可以直接使用 import Header from '@/layout/header/Header.vue' import Menu from '@/layout/menu/Menu.vue' </script> <style scoped lang="less"> .container { height: 100%; .aside { background-color: antiquewhite; } .header { background-color: aquamarine; } .content { background-color: pink } } </style>
<template> <el-menu default-active="2" class="el-menu-vertical-demo" :unique-opened='uniqueOpenedFlag' > <!-- 在为el-menu设置unique-opened属性时必须要确保el-sub-menu、el-menu-item中index的唯一性,如果index不唯一则不生效 --> <!-- 本组件作为父组件向子组件传递数据menuList,子组件需要定义menuList属性以确保可以接受该数据 --> <menu-item :menuList="menuList"></menu-item> </el-menu> </template> <script setup lang="ts"> import { ref, reactive } from "vue"; import MenuItem from "@/layout/menu/item/MenuItem.vue"; // 自定义的假的树形菜单数据 // reactive函数用来处理响应式数据,处理的数据一般是复杂类型数据,如对象类型 // ref函数也可以处理响应式数据,不过数据一般是基本数据类型 const isCollapse = ref(false) const uniqueOpenedFlag = ref(true) const menuList = reactive([ { path: "/system", name: "system", component: "Layout", meta: { title: "系统管理", icon: "Setting", roles: ["sys:manage"], }, children: [ { path: "/worker", name: "worker", component: "Layout", meta: { title: "员工管理", icon: "Setting", roles: ["sys:manage"], }, }, { path: "/happy", name: "happy", component: "Layout", meta: { title: "菜单管理", icon: "Setting", roles: ["sys:manage"], }, }, ], }, { path: "/mail", name: "mail", component: "Layout", meta: { title: "商场管理", icon: "Setting", roles: ["sys:manage"], }, children: [ { path: "/worker11", name: "worker11", component: "Layout", meta: { title: "员工管理22", icon: "Setting", roles: ["sys:manage"], }, }, { path: "/happy22", name: "happy22", component: "Layout", meta: { title: "菜单管理22", icon: "Setting", roles: ["sys:manage"], }, }, ], }, ]); </script> <style lang="less" scoped></style>
<template> <template v-for="item in menuList" :key="item.path"> <!-- 判断该菜单项是否有子菜单 --> <el-sub-menu v-if="item.children && item.children.length > 0" :index="item.path" > <template #title> <el-icon> <!-- 通过动态组件展示图标,因为图标数据一般是通过后端查数据库拿到的 --> <component :is="item.meta.icon"></component> </el-icon> <span>{{ item.meta.title }}</span> </template> <!-- 递归调用,将子菜单传递给组件处理 --> <menu-item :menuList="item.children"></menu-item> </el-sub-menu> <el-menu-item v-else :index="item.path"> <el-icon> <!-- 通过动态组件展示图标 --> <component :is="item.meta.icon"></component> </el-icon> <span>{{ item.meta.title }}</span> </el-menu-item> </template> </template> <script setup lang="ts"> import { Document, Menu as IconMenu, Location, Setting, } from "@element-plus/icons-vue"; // 子组件接受父组件传递的数据 // 本组件为子组件,接受父组件传过来的数据,此处定义menuList属性,接受父组件传递的menuList数据 defineProps(["menuList"]); </script> <style lang="less" scoped></style>
7. 라우팅 및 페이지 연결
src에 있는 라우터의 index.ts 파일 아래에 다음 라우팅 구성을 추가하고 views 폴더에 해당 파일을 생성합니다
<template> <div class="logo"> <img src="/static/imghw/default1.png" data-src="Logo" class="lazy" : / alt="vue3을 사용하여 백엔드 시스템을 구축하는 방법" > <span class="logo-title">{{ title }}</span> </div> </template> <script setup lang="ts"> import { ref } from "vue"; import Logo from "@/assets/logo.png"; const title = ref("博客管理系统"); </script> <style lang="less" scoped> .logo { display: flex; // 弹性布局 width: 100%; height: 60px; line-height: 60px; background-color: rgb(234, 255, 127); text-align: center; cursor: pointer; // 鼠标悬浮在元素上时,鼠标从箭头变成小手 align-items: center; img { width: 36px; height: 36px; margin-left: 20px; // 元素的外边距 margin-right: 12px; } .logo-title { font-weight: 800; // 800为加粗 color: black; font-size: 20px; line-height: 60px; // 元素上下居中 font-family: FangSong; // 字体类型 } } </style>
1. 라우팅 및 페이지 연결 세부 사항에 주의하세요
메뉴 항목 구성 요소에서는 경로의 경로 값을 메뉴 항목의 인덱스 속성에 바인딩하는 것이 목적입니다. element-plus에서 제공하는 내비게이션 메뉴 활성화 시(메뉴 항목을 클릭하면 해당 메뉴 항목이 활성화됨) 해당 인덱스가 라우팅 점프 경로로 사용되므로 이 기능을 사용하려면, 또한 이 기능을 활성화하려면 메뉴 표시줄 구성 요소에 el을 추가해야 하며, 현재 활성화된 메뉴를 나타내려면 default-active 속성을 추가해야 합니다. 사용 사례는 다음과 같습니다
// 在script标签中引入 import MenuLogo from "@/layout/menu/logo/MenuLogo.vue"; // el-menu标签上方引入使用 <menu-logo></menu-logo>
위 내용은 vue3을 사용하여 백엔드 시스템을 구축하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











vue3+vite:src는 require를 사용하여 이미지를 동적으로 가져오고 vue3+vite는 여러 이미지를 동적으로 가져옵니다. vue3을 사용하는 경우 require는 이미지를 사용할 수 없습니다. imgUrl:require(' .../assets/test.png') 와 같은 vue2는 typescript가 require를 지원하지 않기 때문에 가져오므로 이를 해결하는 방법은 다음과 같습니다. waitimport를 사용합니다.

tinymce는 완전한 기능을 갖춘 리치 텍스트 편집기 플러그인이지만,tinymce를 vue에 도입하는 것은 다른 Vue 리치 텍스트 플러그인만큼 원활하지 않습니다.tinymce 자체는 Vue에 적합하지 않으며 @tinymce/tinymce-vue를 도입해야 합니다. 외국 서식 있는 텍스트 플러그인이며 중국어 버전을 통과하지 못했습니다. 공식 웹사이트에서 번역 패키지를 다운로드해야 합니다(방화벽을 우회해야 할 수도 있음). 1. 관련 종속성을 설치합니다. npminstalltinymce-Snpminstall@tinymce/tinymce-vue-S2. 중국어 패키지를 다운로드합니다. 3. 프로젝트 공용 폴더에 스킨과 중국어 패키지를 새로 만들고 다운로드합니다.

페이지를 부분적으로 새로 고치려면 로컬 구성 요소(dom)의 다시 렌더링만 구현하면 됩니다. Vue에서 이 효과를 얻는 가장 쉬운 방법은 v-if 지시어를 사용하는 것입니다. Vue2에서는 v-if 명령을 사용하여 로컬 DOM을 다시 렌더링하는 것 외에도 새 빈 구성 요소를 만들 수도 있습니다. 로컬 페이지를 새로 고쳐야 할 경우 이 빈 구성 요소 페이지로 점프한 다음 다시 돌아올 수 있습니다. 빈 원본 페이지의 beforeRouteEnter 가드. 아래 그림과 같이 Vue3.X에서 새로 고침 버튼을 클릭하여 빨간색 상자 안에 DOM을 다시 로드하고 해당 로딩 상태를 표시하는 방법입니다. Vue3.X의 scriptsetup 구문에 있는 구성 요소의 가드에는

Vue로 블로그 프론트엔드를 구현하려면 마크다운 파싱을 구현해야 합니다. 코드가 있는 경우 코드 하이라이팅을 구현해야 합니다. markdown-it, vue-markdown-loader,marked,vue-markdown 등과 같은 Vue용 마크다운 구문 분석 라이브러리가 많이 있습니다. 이 라이브러리는 모두 매우 유사합니다. 여기서는 Marked가 사용되었고, 코드 하이라이팅 라이브러리로 하이라이트.js가 사용되었습니다. 구체적인 구현 단계는 다음과 같습니다. 1. 종속 라이브러리를 설치합니다. vue 프로젝트에서 명령 창을 열고 다음 명령 npminstallmarked-save//marked를 입력하여 markdown을 htmlnpmins로 변환합니다.

vue3 프로젝트가 패키징되어 서버에 게시되면 액세스 페이지에 공백 1이 표시됩니다. vue.config.js 파일의 publicPath는 다음과 같이 처리됩니다. const{defineConfig}=require('@vue/cli-service') module.exports=defineConfig({publicPath :process.env.NODE_ENV==='생산'?'./':'/&

최종 효과는 VueCropper 컴포넌트 Yarnaddvue-cropper@next를 설치하는 것입니다. 위의 설치 값은 Vue2이거나 다른 방법을 사용하여 참조하려는 경우 공식 npm 주소: 공식 튜토리얼을 방문하세요. 컴포넌트에서 참조하고 사용하는 것도 매우 간단합니다. 여기서는 해당 컴포넌트와 해당 스타일 파일을 소개하기만 하면 됩니다. 여기서는 import{userInfoByRequest}from'../js/api만 소개하면 됩니다. 내 구성 요소 파일에서 import{VueCropper}from'vue-cropper&

머리말 Vue든 React든, 여러 개의 반복되는 코드를 접하게 되면, 파일을 중복된 코드 덩어리로 채우는 대신, 이러한 코드를 어떻게 재사용할 수 있을지 고민해 보겠습니다. 실제로 vue와 React 모두 컴포넌트를 추출하여 재사용할 수 있지만, 작은 코드 조각이 발견되어 다른 파일을 추출하고 싶지 않은 경우, 이에 비해 React는 동일한에서 사용할 수 있습니다. 파일에서 해당 위젯을 선언합니다. 또는 다음과 같은 renderfunction을 통해 구현합니다. constDemo:FC=({msg})=>{returndemomsgis{msg}}constApp:FC=()=>{return(

vue3+ts+axios+pinia는 무의미한 새로 고침을 실현합니다. 1. 먼저 프로젝트에서 aiXos 및 pinianpmipinia를 다운로드합니다--savenpminstallaxios--save2. AxiosResponse}from"axios";importaxiosfrom'axios';import{ElMess
