vue3基础复习补充 3-30

vue3基础1

  • 关于vite

  • 搭建vue3项目

  • 单文件组件

  • mustach 表达式

  • 组件创建及使用

  • vue指令

vue基础

声明式渲染: 有自己独立模板语法 template

响应式数据: 不再需要操作dom,只要数据发生改变 (使用了这个数据的dom)页面会自动更新

单页应用 (SPA) : 整个项目只有一个html文件 (多页面的实现思路,借助hash 锚点---页面路由)

服务端渲染 (SSR): SSR 为了SEO 关键字搜索引擎优化

开发桌面端、移动端、WebGL,甚至是命令行终端中的界面

1.vite 创建vue3项目

https://cn.vitejs.dev/guide/ vit官网

  # npm 7+,需要添加额外的 --:
  $ npm create vite@latest my-vue-app -- --template vue

  • 运行项目之前

1.下载项目需要的三方包

  
  npm install //后面不用跟东西

scripts 项目可以使用命令

  
    "scripts": {
      "dev": "vite",     #启动 编译 本地环境   npm run dev
      "build": "vite build",   #编译为 生产环境   npm run build 
      "preview": "vite preview"#预览
    },
  • 项目根目录下 cmd

  
  npm run dev 
  • 打开浏览器 访问 快捷打开:Ctrl+左键

  
  http://localhost:5173

1.1 文件解读0

main.js 这个文件不动它

  //导入 vue的实例创建方法 createApp 
  import { createApp } from 'vue'
  //导入全局的默认样式
  import   './style.css'
  // 导入第一个vue组件  将这个组件放到页面上
  import App from './App.vue'
  ​
  //初始化vue的实例对象 并传入第一个组件的代码
  const app = createApp(App)
  ​
  //找页面 id=app  的节点(在index.html里面找), 将所有的vue代码都放到这个节点里面
  app.mount('#app')
  //mount:挂载

2.单文件组件 SFC single File component

插件安装:

  • vue-official

  • vue 3 snippets

single File component:就是一个 .vue文件中能写什么内容

scoped作用:形成一个独立的作用域 这个css代码只能在当前组件使用

  
  <template>
     //写html代码  
  </template>
  ​
  <script setup>
      //写js代码
  </script>
  ​
  <style  lang="less | scss | stylus"  scoped>
  //写css代码
      p{
          height:1000px;
      }
  </style>
  ​
  ​
  
  <template>
      <div class="box">
        <span>
          我是第一个vue组件
        </span>
      </div>
  </template>
  ​
  <script setup>
      let a = 100;
      let b =200;
      console.log(a+b);
  </script>
  ​
  <style scoped >
  .box{
    width: 100%;
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
  }
  </style>

app的样式写在style.css中,因为app不在这个组件范围内

响应式数据 hooks -mustach 语法 【双向绑定】

  
  模版字符串里的  ${} mastach
  react里的   {}  mastach
  vue的  {{}}
  • 响应式数据的核心思维(称为:双向绑定):

数据改 页面自动改

页面改 数据自动改

购物车计数器 步进器

  • ref 定义响应式数据

  
  <template>
    //html中取值 不用写value 属性
    //用mustach语法取一个变量  变量名为a
     {{a}}
  </template>
  ​
  <script setup>
    //ref是从vue的核心库里面暴露出来的
    import {ref} from 'vue'
      
    const a = ref(初始值)
    
    //js取值 a.value   改值  a.value = 新数据
      
  </script>
  ​
  • reactive定义响应式数据

  
  <template>
    //html中取值 不用写value 属性
     {{data.a}}
  </template>
  ​
  <script setup>
    import {reactive} from 'vue'
      
    const data = reactive({
        a:''
    })
    
    //js取值 data.a   改值 data.a= 新数据
      
  </script>
  • 计数器

  
  <template>
      <button v-on:click="add">+</button> 
      <span> {{ num }}</span> 
      <button @click="reduce">-</button>
  </template>
  ​
  <script setup>
   //hooks 函数 钩子函数
   //reactive()
   //ref()
   //vue 里面封装了两个hooks 并通过单个暴露的语法 进行了暴露
  import {ref} from 'vue'
   //let num = 1 普通变量
  // 响应式数据的变量   是一个对象
  const num = ref(1);
   console.log(num.value);
  const add = ()=>{
      num.value++;
      // 修改数据之后 拿到dom 重新渲染节点
      console.log(num.value);
  }
  const reduce = ()=>{
      num.value--;
      console.log(num.value); 
  }
  </script>
  ​
  • 练习

请实现 点击“生成验证码” 按钮,输出一个 由 字母和数字组成的四位随机数到页面上

  
  <template>
  ​
      <button @click="getyzm"> 生成验证码  </button>
      <div>
          {{yzm  }}
      </div>
  </template>
  ​
  <script setup>
      import {ref} from 'vue'
  ​
      const yzm = ref('')
  ​
      const getyzm = ()=>{
          let str = ''
          let defaultArr= 'qwertyuiopasdfghjklzxcvbnm0123456789'.split('');
          for(let i=0;i<4;i++){
              let index =parseInt(Math.random()*36)
              str+=defaultArr[index];
          }
          yzm.value = str;
      }
      getyzm()
  ​
  ​
  </script>

4.vue指令 14个 17:10

  
  <标签 v-xxx="xxxxxx" ></标签>
  xxx: 指令名 
  xxxxxx 指令触发做的事情
  • v-on 事件

  
  <div v-on:事件类型="事件的执行函数"> + </div>
  ​
  • 最常见用法 事件触发并传数据

  
  <template>
    <div v-on:click="btn(100)">
      点我啊
    </div>
  </template>
  <script setup>
  // 点击事件的函数
  const btn = (a) => {
    console.log('点你了~~~', a);
  }
  </script>
  ​
  • 只触发事件 不传数据 默认带event

  
  <template>
    <div v-on:click="btn">
      点我啊
    </div>
  </template>
  ​
  <script setup>
  // 点击事件的函数
  const btn = (event) => {
    console.log('点你了~~~',event );
  }
  </script>
  • 事件执行函数 放在html里面

  
  <template>
    <div v-on:click="e=>console.log('点你了',e)">
      点我啊
    </div>
  </template>
  ​
  • 传参数 并传递event写法

  
  <template>
    <div v-on:click="e=>btn(100,e)">
      点我啊
    </div>
  </template>
  <script setup>
  // 点击事件的函数
  const btn = (a,event) => {
    console.log('点你了~~~', a,event);
  }
  </script>
  • 简写事件 将v-on: 简写为 @

  
  <template>
    <div @click="e=>btn(100,e)">
      点我啊
    </div>
  </template>
  <script setup>
  // 点击事件的函数
  const btn = (a,event) => {
    console.log('点你了~~~', a,event);
  }
  </script>
  • v-text v-html 节点渲染 {{}}

v-html : 将 带有标签的字符串 渲染到页面dom中 innerHTML

v-text :将纯文本渲染到页面dom中 innerText

  
  <template>
      <div> {{  '你好啊,我是'+name }}</div>
      <div v-text="name1"> </div>
      <div v-html="name1"></div>
  </template>
  ​
  <script setup>
          let str= '你好啊,我是邓金阳'
          let name = '邓金阳'
          let name1 = `<h1>邓金阳</h1>`
  </script>
  • v-show v-if 显隐

表达式结果为:

true :显示

false:隐藏

以前是拿到dom节点 更改style属性为display:none

这里v-show就跟以前一样

  
  <div v-show="表达式">  </div>
  <div v-if="表达式">  </div>
  ​
  
  <template>
           <div v-show="gender==0">男</div>
           <div v-show="gender==1">女</div>
  </template>
  <script setup>
       let gender = 0;   //0显示男  1女
  </script>

  • v-if v-else-if v-else 判断

多条件判断

  
  <div v-if="条件1">  </div>
  <div v-else-if="条件2">  </div>
  <div  v-else>  </div>

根据成绩输出 优良中差

  
  <template>
      <!-- 90 优秀  80良好  60及格  60以下 差 -->
       <div v-if="num>=90">优秀</div>
       <div v-else-if="num>=80">良好</div>
       <div v-else-if="num>=60">及格 </div>
       <div v-else>差</div>
  </template>
  ​
  <script setup>
      let num = 55
  ​
  </script>
  • v-model form双向绑定

获取表单数据的

  
  <template>
      <input v-model="formData.account" >
      <input v-model="formData.password">
      <button @click="getData">获取数据</button>
      
  </template>
  ​
  <script setup>
      import {reactive} from 'vue'
      
      const formData= reactive({
          account:'',
          password:''
      })
  ​
      const getData  = ()=>{
          console.log(formData );
          
      }
      
     
  </script>

面试题

  • reactive和ref的区别?

ref更适合定义普通 基本 简单类型的变量 需要通过value进行取值

reactive更适合定义引用数据类型 不需要通过.value进行取值

  • v-text v-html {{}} 三种渲染dom的语法有什么区别

{{}} 更适合于 里面需要做拼接,要写表达式的情况,可以写多个变量在里面进行运算,最后输出运算或者拼接的结果,但会把标签当做纯文本输出

v-text 不能够进行运算,只能直接输出跟的变量的值,同样会把标签当做纯文本输出

v-html 不能够进行运算,只能直接输出跟的变量的值,可以解析标签并输出内容

  • v-show v-if 的区别【重要!!!】

v-show 当条件不满足 操作的style:display:none

v-if 条件满足,创建标签,如果条件不满足,标签不创建,更彻底

性能区别:

  • 假设不需要频繁切换显示隐藏状态,v-if的性能更高(如果只是一次显隐的判断,v-if只用生成一个dom就结束了,另一个不满足条件的dom不需要生成)

  • 假设需要频繁切换显示隐藏状态,v-if需要反复的去创建删除dom节点,但是v-show只需要更改style样式

<think> 嗯,用户想要获取使用Electron和Vue 3进行桌面开发的相关信息。根据提供的引用内容,有三个关键点:引用[1]提到了electron+vite+vue3的快速入门教程和Electron API文档;引用[2]提供了打包所需的依赖项;引用[3]则指出该内容适合初级开发者和需要复习的开发人员。 用户明确询问的是方法和资源,看来需要结构化的步骤说明。我考虑将整个流程拆分为环境搭建、项目创建、开发调试、打包发布四个核心环节,这样符合学习路径也便于用户实操。对于每个环节,准备补充具体的技术细节:比如在环境搭建部分说明Node.js版本要求,在项目创建部分给出Vite模板的具体命令。 引用中提到的electron-builder和electron-packager都是重要打包工具,但两者使用场景不同:electron-builder更适合生成安装包,而electron-packager用于快速打包可执行文件。这个区别需要在资源推荐部分明确说明,避免用户混淆。 关于教程资源,除了引用[1]提到的官网文档,还考虑推荐几个优质中文教程。不过要注意资源时效性——Vue 3和Electron的更新较快,2020年前的教程可能已过时,优先选择2022年后的内容比较稳妥。突然想到electron-icon-builder这个依赖项在引用[2]被提及,但用户若没有图标需求其实可以省略,这点可以在注意事项里说明。 最后设置的问题要覆盖用户可能的后续需求:性能优化和跨平台打包是实际开发中的高频痛点,而结合Vue的状态管理则是架构设计的关键。特意加入"Electron API调用"这个问题,因为引用[1][3]中都强调过原生功能对接的重要性。 </think> 以下是使用 Electron 和 Vue 3 进行桌面开发的完整指南,结合了官方推荐的工作流和社区最佳实践: ### 一、开发环境搭建 1. **基础依赖** ```bash npm install -g yarn # 推荐使用yarn管理依赖 node -v # 需不低于v18.0.0 ``` 2. **项目脚手架** 使用官方推荐的 Vite + Electron 模板: ```bash npm create electron-vite@latest ``` 选择 `vue` 或 `vue-ts` 模板生成项目结构[^1]。 --- ### 二、项目创建与配置 1. **目录结构示例** ``` ├── src │ ├── main (Electron主进程代码) │ ├── renderer (Vue3渲染进程代码) │ └── preload (进程间通信脚本) ├── electron.vite.config.js └── vite.config.js ``` 2. **关键配置** (`electron.vite.config.js`) ```javascript export default { main: { build: { outDir: &#39;dist/electron/main&#39; } }, preload: { build: { outDir: &#39;dist/electron/preload&#39; } }, renderer: { root: &#39;src/renderer&#39;, build: { outDir: &#39;dist/renderer&#39; } } } ``` --- ### 三、核心开发流程 1. **主进程开发** (`src/main/index.js`) ```javascript import { app, BrowserWindow } from &#39;electron&#39; import path from &#39;path&#39; app.whenReady().then(() => { const win = new BrowserWindow({ webPreferences: { preload: path.join(__dirname, &#39;../preload/index.js&#39;) } }) win.loadURL(process.env.VITE_DEV_SERVER_URL) // 开发环境加载Vite服务 }) ``` 2. **渲染进程开发** (Vue3组件示例) ```vue <script setup> import { ref } from &#39;vue&#39; const count = ref(0) </script> <template> <button @click="count++">点击次数: {{ count }}</button> </template> ``` 3. **进程通信** (`src/preload/index.js`) ```javascript import { contextBridge, ipcRenderer } from &#39;electron&#39; contextBridge.exposeInMainWorld(&#39;electronAPI&#39;, { openFile: () => ipcRenderer.invoke(&#39;dialog:openFile&#39;) }) ``` --- ### 四、调试与打包 1. **开发模式运行** ```bash npm run dev # 同时启动Vite服务+Electron ``` 2. **生产环境打包** 安装构建工具: ```bash npm install electron-builder --save-dev ``` 配置 `package.json`: ```json { "build": { "appId": "com.example.app", "files": ["dist/**/*"], "win": {"target": "nsis"}, "mac": {"target": "dmg"} }, "scripts": { "build": "vite build && electron-builder" } } ``` --- ### 五、关键资源推荐 1. **官方文档** - [Electron API 文档](https://www.electronjs.org/docs/latest/api/app) [^1] - [Vite 官方指南](https://vitejs.dev/guide/) - [Vue 3 组合式 API](https://vuejs.org/guide/extras/composition-api-faq.html) 2. **实用工具库** - `electron-updater`:自动更新功能 - `electron-log`:跨进程日志记录 - `vite-plugin-electron`:深度集成插件 --- ### 注意事项 1. **安全规范** - 禁用 `nodeIntegration: true` ⚠️ - 使用 `contextBridge` 暴露最小必要 API - 内容安全策略(CSP)设置参考: ```html <meta http-equiv="Content-Security-Policy" content="default-src &#39;self&#39;"> ``` 2. **性能优化** ```javascript // 预加载脚本中使用Node.js模块 const fs = require(&#39;fs&#39;) contextBridge.exposeInMainWorld(&#39;fs&#39;, { readFile: fs.promises.readFile }) ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值