# xust-vue **Repository Path**: azureroots/xust-vue ## Basic Information - **Project Name**: xust-vue - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-03-03 - **Last Updated**: 2026-03-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Vue ## 1、basics 这个项目中涉及的是 `Vue` 最基础的内容。 ### 生命周期 请参见 `elements` 项目中的 `views` 目录下的各个组件。 > 官方文档: > > https://cn.vuejs.org/guide/essentials/lifecycle.html ## 2、组件 ### 2.1、新建项目 在 `xust-vue` 仓库中创建一个新的名称为 `components` 的项目(通过`vite`方式来创建即可): ```cmd X:\bytecreek\mycodes\xust-vue> >pnpm create vite .../19cbb8f73a8-1fc0 | +1 + .../19cbb8f73a8-1fc0 | Progress: resolved 1, reused 1, downloaded 0, added 1, done | o Project name: | components | o Select a framework: | Vue | o Select a variant: | JavaScript | o Use Vite 8 beta (Experimental)?: | No | o Install with pnpm and start now? | No | o Scaffolding project in X:\bytecreek\mycodes\xust-vue\components... | — Done. Now run: cd components pnpm install pnpm dev ``` 进入到 `components` 项目中: ```cmd X:\bytecreek\mycodes\xust-vue>cd components X:\bytecreek\mycodes\xust-vue\components> ``` 通过 `pnpm` 安装依赖: ```cmd pnpm install ! The local project doesn't define a 'packageManager' field. Corepack will now add one referencing pnpm@10.30.3+sha512.c961d1e0a2d8e354ecaa5166b822516668b7f44cb5bd95122d590dd81922f606f5473b6d23ec4a5be05e7fcd18e8488d47d978bbe981872f1145d06e9a740017. ! For more details about this field, consult the documentation at https://nodejs.org/api/packages.html#packagemanager Packages: +35 +++++++++++++++++++++++++++++++++++ Progress: resolved 84, reused 35, downloaded 0, added 35, done dependencies: + vue 3.5.29 devDependencies: + @vitejs/plugin-vue 6.0.4 + vite 7.3.1 ╭ Warning ───────────────────────────────────────────────────────────────────────────────────╮ │ │ │ Ignored build scripts: esbuild@0.27.3. │ │ Run "pnpm approve-builds" to pick which dependencies should be allowed to run scripts. │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────╯ Done in 6.1s using pnpm v10.30.3 ``` 项目创建完毕后,可以清理一下不必要的文件和目录。 ### 2.2、配置项目 #### 2.2.1、设置端口 在 `vite.config.js` 中可以设置端口: ```js import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' // https://vite.dev/config/ export default defineConfig({ plugins: [vue()], server: { port: 8080, }, }) ``` #### 2.2.2、配置别名 ```js import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' // 从 node 中导入 path 模块 import path from 'path' // https://vite.dev/config/ export default defineConfig({ plugins: [vue()], server: { port: 8080, }, resolve: { alias: { '@': path.resolve(__dirname, 'src'), }, }, }) ``` 为 项目主目录下的 `src` 目录指定别名 `@` 后,即可在项目中统一使用 `@` 来引用 `src` 目录。 ### 2.3、定义并使用组件 #### 2.3.1、定义组件 #### 2.3.2、使用组件 导入组件 使用组件 ### 2.4、组件关系 根据`@/App.vue`中的代码来理解组件之间的关系: ```vue ``` #### 2.4.1、根组件 在 `main.js` 中用来创建 `Vue` 实例并挂载到 DOM 节点上去的那个组件就是 **根组件** 。 ```js import { createApp } from 'vue'; // 导入根组件 import App from '@/App.vue'; // 用根组件创建Vue实例 const instance = createApp(App); // 挂载实例到 #app 元素 instance.mount('#app'); ``` 通常项目根目录下的 `src` 目录中的 `App.vue` 为根组件。 #### 2.4.2、父组件 以`@/App.vue`中`template`代码为例: ```vue ``` 此处 `ShoppingCart` 组件就是 `CartItem` 和 `TotalPrice` 的**父组件**。 同时,根组件 `App` 也是 `ShoppingCart` 的**父组件**。 #### 2.4.3、子组件 以`@/App.vue`中`template`代码为例: ```vue ``` 此处 `CartItem` 和 `TotalPrice` 就是 `ShoppingCart` 组件的**子组件**。 同时, `ShoppingCart` 也是根组件 `App` 的**子组件**。 确切地说, `CartItem` 和 `TotalPrice` 是 `ShoppingCart` 的 **直接子组件**,`ShoppingCart` 也是 `App` 的**直接子组件**。 对于 `CartItem` 和 `TotalPrice` 来说,它们也是 根组件 `App` 的子组件,只不过是间接的子组件。 #### 2.4.4、兄弟组件 拥有共同直接父组件的多个组件互为兄弟组件。 以`@/App.vue`中`template`代码为例: ```vue ``` 此处 `CartItem` 和 `TotalPrice` 就是**兄弟组件**。 #### 2.4.5、其他关系 ### 2.5、组件通信 #### 2.5.1、传递`props` 从父组件通过属性向子组件传递数据。 以下按照 定义Props、传递Props、使用Props 三个步骤来讲解。 ##### 1、定义`Props` 在 `ShoppingCart.vue` 中定义 `Props` : ```vue ``` ##### 2、传递`props` 在 `App.vue` 组件中使用 `ShoppingCart` 组件时,可以通过 `props` 向 `ShoppingCart` 组件传递数据: ```vue ``` 以上用法中: - `v-bind:owner="account"` 是显示通过 `v-bind` 指令为 `shopping-cart` 组件绑定 `props` - 其中 `account` 必须是在 `App.vue` 中已经定义过的**变量** - `:owner="account"` 是使用了语法糖,将 `v-bind:owner` 缩写为 `:owner` - 其中 `account` 必须是在 `App.vue` 中已经定义过的**变量** - `owner="account"` 是直接将等号之后的引号中的内容作为字符串值传递给 `shopping-cart` 的 `owner` - 注意,等号之后的 `account` 仅是个字符串而已,它不表示变量。 - `` 表示没有传递 `props` - 当未向 `shopping-cart` 传递 `owner`时,在 `shopping-cart` 内部 `owner` 取值为 `undefined` 。 ##### 3、使用`props` 在 `ShoppingCart.vue` 的模板(`template`)中可以直接使用相应的 `props`: ```vue ``` 而在 ` ``` #### 2.5.2、分发内容 通过插槽来分配内容,在父组件中通过插槽向子组件分发内容。 在 `@/views/` 目录下创建 `Book.vue` ,其中内容如下 ```vue ``` 在 `@/views/Book.vue`中除基本结构外暂不写其它内容。 ##### 1、插槽出口 `` 元素是一个**插槽出口** (slot outlet)。 在 `@/views/Book.vue`中定义 插槽出口: ```vue ``` 其中的``标示了父元素提供的**插槽内容** (slot content) 将在哪里被渲染。 另外需要注意: - 带 name 的插槽被称为**具名插槽** ( named slots ) ```vue ``` - 没有提供 name 的 `` 出口会隐式地命名为 `default` ```vue ``` - 在 `` 和 `` 之间可以书写默认内容 - 当父元素未向插槽分发内容时,就会显示默认内容 ```vue 默认内容 ``` ##### 2、插槽内容 在父元素中可以通过子组件的标签体向子组件**“分发”**内容。 比如在 `@/App.vue` 中可以将 `` 和 `` 之间的内容分发给 `book` 组件的相应插槽 : ```vue ``` 需要特别注意的是,插槽内容**无法访问**子组件中的数据。 以上案例中,在 `` 和 `` 之间仅能访问`App` 组件中的数据,不能访问在 `Book` 组件中定义的数据。 #### 2.5.3、案例: 购物车 本节以 **"传递props"** 和 **"分发内容"** 为基础对购物车模块进行改造。 ##### 1、定义商品列表 在 `App.vue` 中定义商品列表: ```vue ``` ##### 2、定义`props` 为 `CartItem.vue` 定义名称为 `goodsItem` 的 `props` : ```vue ``` ##### 3、传递商品数据 在`App.vue`的 `