尚硅谷vite+vue3 (尚医通)项目实战笔记

本文详细介绍了如何在Vue项目中配置Vite自动启动、设置src别名、引入scss并处理类型提示,还包括清除默认样式、修改第三方组件样式、使用深度选择器、全局样式管理和Vue3的prop定义,以及如何在Vue3中使用scss定义全局变量。
摘要由CSDN通过智能技术生成

如何配置项目运行后自动打开?
在package.json 启动命令中添加
“dev”: “vite --open”,

如何配置src的别名?
利用node内置模块path设置一下在vite.config.ts 中的别名

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      "@": path.resolve(__dirname, 'src')
    }
  }
})

如果出现了红色的错误提示需要安装@types/node 是ts的一个声明文件包,用于描述nodejs常用的模块和常用的第三包ts类型
这样配置完成后我们在编辑器中编写没有提示,需要在项目的ts.config中添加配置

 "baseUrl": ".",
    "paths": {
      "@/*": [
        "src/*"
      ]
    },

如何在开发前清除默认样式?
首先我们可以在npm官网搜索下reset 文件直接复制到我们的工程中
然后在main.ts 中引入该文件

报错没有scss因为脚手架默认支持的css,我们需要安装下scss

试图直接npm i scss ,启动项目依然报错了
在这里插入图片描述

报错内容是找不到sass,我使用的后缀文件是scss,为何提示的内容是找不到sass ?

这里需要分清楚sass和scss的区别了
Sass是为了使CSS开发更方便而产生的,原先我们是用原生CSS来写样式,增加了编程的特性,但它不方便,比如:不支持嵌套、运算、作用域 等

// 下面是sass的语法
nav
  ul
    margin: 0
    padding: 0
    list-style: none

  li
    display: inline-block

  a
    display: block
    padding: 6px 12px
    text-decoration: none

而Scss(sassy css)是Sass((Syntactically Awesome Stylesheets)的改良版本。sass使用缩进,这对于写惯css的开发者来说很不直观,也不能将css代码加入到Sass里面。因此sass语法进行了改良,Sass 3就变成了Scss(sassy css),与原来的语法兼容,只是用{}取代了原来的缩进。而且,所有有效的 CSS 也同样都是有效的 SCSS

// 下面这个是scss的语法
nav {
  ul {
    margin: 0;
    padding: 0;
    list-style: none;
  }

  li { display: inline-block; }

  a {
    display: block;
    padding: 6px 12px;
    text-decoration: none;
  }
}

官网:https://sass.bootcss.com/guide.html
两个是一个东西,只是语法不同

引入element-plus组件库,如何修改输入框的宽度?
直接找到它的类名覆盖不生效,因为我们组件样式有scope 局部样式,想要修改第三方组件库的样式,可以使用深度选择器

为什么加了scope就可以实现样式的隔离了?

为组件的 <style> 标签添加 scoped 特性,我们可以确保组件的样式仅应用于该组件的模板中,而不会影响其他组件或全局样式。
原理就是给当前元素及子元素都加上data-v-开头的一串随机 hash 值,
css中通过属性选择器选择这个 hash ,这样就确保了唯一性,避免样式污染
在这里插入图片描述
那为什么修改了外部组件库(如iview)中组件的样式不起作用呢?
在这里插入图片描述
深度选择器有什么作用呢?
可以让样式穿透到子组件中,例如一个父组件中使用了一个子组件,并且需要修改子组件内部某个元素的样式

<template>
  <div class="parent">
    <MyComponent></MyComponent>
  </div>
</template>

<style scoped>
.parent /deep/ .child {
  color: red;
}
</style>

如上面这个不加deep只影响当前组件的.child类,无法修改子组件的类

如何使用深度选择器呢?
第一种写法:scss等预处理器却无法解析,css中可以


/deep/ .child-component {
  color: blue;

第二种写法:scss等预处理器却无法解析,css中可以

.search-input >>>.el-input__inner{
	border: 0 !important;
	text-indent: 20px;
}

第三种写法:在预处理器和css中都有效,会出现如下提示
[@vue/compiler-sfc] ::v-deep usage as a combinator has been deprecated. Use :deep() instead of ::v-deep .


.parent ::v-deep .child-component {
  background-color: red;
}

尝试修改为:

.search :deep(.el-input__wrapper) {
    width: 700px;
    background-color: red;
}

或者也可以这么写

.search {
    ::v-deep(.el-input__wrapper) {
        width: 700px;
        background-color: rgb(30, 255, 0);
    }
}

如何优雅的覆盖组件库样式呢?
1、两个style,组件中同时使用有 scoped 和非 scoped 样式;
2、组件样式文件引入在前,自定义样式文件引入再后
3、使用深度选择器

上面提到的选择器react和vue中都可以使用吗
搜了下资料,对于react基本都是使用 :global(.className) 可以实现样式穿透,针对局部class类名下的全局UI组件


.divBox {
    :global(.content){
        ...
    }
}
 
/* 定义全局样式 */
:global(.text) {
  font-size: 16px;

为什么react中不能使用deep?
应该和框架的设计有关系,有研究过的大佬可以指点下

使用element-plus 的分页器,怎么让文案变成中文?
查看官网国际化配置,添加即可
按照官网的方法引入zhCn
import zhCn from ‘element-plus/dist/locale/zh-cn.mjs’
编辑器报错:Could not find a declaration file for module ‘element-plus/dist/locale/zh-cn.mjs’. ‘c:/Users/LL/Desktop/cloudUI2.0/node_modules/element-plus/dist/locale/zh-cn.mjs’ implicitly has an ‘any’ type. If the ‘element-plus’ package actually exposes this module, try adding a new declaration (.d.ts) file containing declare module 'element-plus/dist/locale/zh-cn.mjs';

解决方法在项目根目录 env.d.ts中添加下面这行代码

declare module ‘element-plus/dist/locale/zh-cn.mjs’;

为什么需要对axiso进行二次封装?
1、利用aioxs请求、响应拦截器的功能
2、请求拦截器一般可以携带公共的参数,如请求头中添加token
3、响应拦截器,简化服务器的数据,处理网络错误

vue3里面怎么定义prop
这是比较完整的写法,通过props可以直接在使用,但不能更改

const props = defineProps({
    message: {
      type: String,
      default: '',
      required:false
    },
    count: {
      type: Number,
      default: 0,
      required:true
    }
}),

也可以简写:

const props = defineProps(['hospitalList']);

第一种写法的type如何写自定义的类型呢?
type 可以是下列原生构造函数中的一个:
String
Number
Boolean
Array
Object
Date
Function
Symbol
自定义的写法:
字符串:

defineProps({
  acb: Array as () => string[]
})

对象:

defineProps({
  company: Object as () => ({name: string, domain: string})
})
type Compay={ name:string,domain:string }

defineProps({ compmay: 
{
  type:Object as ()=> Compay
})

函数:

type func=(args?: string[])=> string
defineProps({
     func:{
        type: Function as ()=> PropType<func>
     }
})

如何实现一段文本只展示一行剩下的省略?

  li { 
            overflow: hidden;// 设置了这个超出就截断了
            text-overflow: ellipsis;// 超出使用省略号表示
            margin-top: 7px;
            font-size: 14px;
            white-space: nowrap;//设置了这后不会换行,仅一行展示
     }

如何在vue3项目中使用scss 定义全局变量并使用?
比如我想定义一个全局的主题色,任何组件直接使用该变量即可
我尝试定义一个global.scss 并在main.css中直接引入,但是报错了
在这里插入图片描述
解决方法:
1、安装 sass-loader :npm i sass-loader@10 -D
2、不要在 【main.ts】中全局引入,直接在【vite.config.ts】中处理

import { defineConfig } from 'vite'
export default defineConfig({
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@import "./src/styles/index.scss";`
      }
    }
  }
})

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值