# Demo
**Repository Path**: moonstarKira/demo
## Basic Information
- **Project Name**: Demo
- **Description**: 用户文章管理系统
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-03-02
- **Last Updated**: 2023-08-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
### 创建vue项目步骤
1.vue create 项目名 创建项目
安装命令:npm/cnpm/yarn
2.安装eslint 一种代码规范,约束代码风格
3.封装组件库
安装element-ui包
yarn add element-ui 安装的是支持vue2的包
新建element-ui文件夹
新建index.js文件,
导入包
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)
在main.js在使用
4.封装请求库
安装axios
yarn add axios
### git使用
先在gitee创建仓库,设置项目
初始化项目:
git init
暂存当前所有项目,到内存
git add.
git commit -m '项目模板'
bash项目
初始化,第一次建立连接时使用:
git remote add origin 项目地址
git push -u origin "master"
### 本地持久化
默认安装的是vue3版本,vue2版本:yarn add vuex-persistedstate@3.2.1
安装完后在store里引入:
import createPersistedstate from 'vuex-persistedstate'
plugins: [createPersistedstate()],
### token
登陆密钥,用户登录时后台返回一个token保存到store里面
注意:token是有时效性,用户登陆过期后要清除用户信息
### vuex
const store = new Vuex.Store({
state: {
//相当于自定义组件中的data
},
getters:{
//相当于自定义组件中的computed
//不会改变state中的数据,会生成一个新的数据,起到包装作用
当state中数据改变时,getters中数据也会改变。相当于自定义组件中的computed,getter的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
Getter 接受 state 作为其第一个参数,也可以接受其他 getter 作为第二个参数。
使用方法
this.$store.getters.方法名
mapGetters
},
mutations: {
//相当于自定义组件中的methods,只能做同步的操作
//对state中的数据进行修改,mutations是更改state中数据的唯一方法
//使用方法
方法1: this.$store.commit("mutations中函数名称",参数)来触发mutation函数,可以传参
mapMutation
},
actions: {
//异步操作,例如ajax请求
//使用commit 触发 mutations
//在这里,我们写异步操作,因为mutations中只能处理同步操作,但是
//actions还是要通过触发mutation的方式间接变更数据。
相当于在action中处理异步操作,处理完之后,触发mutation来修改数据。
配合commit,dispatch使用
使用方法
方法2: mapActions使用方法同上
方法1: 通过this.$store.dispatch("action中函数名称")来触发 异步函数,并且传参
}
})
### echarts的使用
安装echarts:npm install echarts --save
项目中引入:import * as echarts from 'echarts'
单独引入使用 import { 变量名 } from 'echarts'
echarts 內部用的是命名导出,export const 变量名 多个
### 表单属性ref
ref 属性涉及Dom 元素的获取(el-form表单对象)。javasrcipt获取Dom元素是通过:document.querySelector(".input")获取dom元素节点 。
Vue 为简化DOM获取方法提出了ref 属性和$refs 对象。一般的操作流程是:ref 绑定控件,$refs 获取控件。
### 传入对象解构赋值
先把传给形参的对象结构赋值
在函数里,函数名和函数值一样可以只写一个
### 上传用户头像
上传头像时,不用原生的input标签,因为比较难改样式
而是把原生标签绑定到btn里面,通过ref属性,点击btn触发input的点击事件
上传文件时,要把文件转换成base64字符串,在把它渲染到页面
前端上传文件到js缓存里有两种方法:
// 要求:选择文件,给到img标签做预览
// img标签的src值只能是图片“链接地址”(外链http://开头,图片文件相对路径)
// 或者是图片的base64字符串(而且字符串还必须是data:image/png;base64,图片转base64字符串
// --------------------------------------------------------------------------------
// 解决方案1:文件 -> 内存临时地址(这地址只能在js内存里,不能发给后台)
// 语法:URL.createOjectURL(文件)
// 返回值:内存临时地址
// this.avatar = URL.createObjectURL(files[0])
// --------------------------------------------------------------------------------
// 解决方案2:文件-> base64字符串(可以发给后台)
const fr = new FileReader()
fr.readAsDataURL(files[0])// 传入文件对象开始读
fr.onload = (e) => { // onload等待把文件读成base64字符串后会触发onload事件函数
this.avatar = e.target.result // e.target.result保存读取完的结果,显示在src里面
}
### 文章发布遇到的问题
v-model 和:model
v-model:指的是数据双向绑定
:model:是v-bind:model的简写,是单向数据绑定,指从父组件传递指=值给子组件
### v-for的使用
v-for在哪个上面绑定,就会循环渲染哪个标签
一些封装的组件标签不能使用v-for,可以在外面包一个template,在template里面使用
### 富文本编辑器
富文本:就是可以带标签和样式的字符串,一般用于设置一个文章/产品的主体内容
富文本编辑器的内容实际上是一段标签
基于vue-quill-editor实现富文本编辑器
安装:yarn add vue-quill-editor/npm install vue-quill-editor --save
网址:https://www.npmjs.com/package/vue-quill-editor
后台响应的文本是html格式的文本需要在标签里用 v-html解析
### 修改组件内样式
vue中style标签有scoped属性,此属性防止css样式污染,对组件进行限定css作用域,当有scoped属性时,它的css只作用于当前组件中的元素。
原理:
scoped属性其实就是给每个dom节点元素都添加了不重复的自定义属性(data-v-xxxx);
在编译时再给样式的末尾添加属性选择器进行样式私有化,设置了scoped属性,在浏览器编译后会在标签里添加添加一个属性 data-v-xxxxx,即使是两个互不相关的组件使用了相同的类名,通过这个自定义属性也能标识,使样式互不影响。
四种情况:
1.父组件和子组件都没添加scoped
父组件可能会覆盖子组件的style
2.父组件未添加scoped,子组件添加了scoped
子组件的自定义属性使得子组件的权重增加,覆盖本来会对子组件产生作用的父组件样式。
3.父组件添加scoped,子组件未添加
父组件元素都添加上data-v- 属性,包括子组件的根节点,但是子组件的内层样式 不会受到影响,这也是直接修改element-ui或者vant-ui子组件不生效的原因,要借助深度作用选择器或样式不写在scoped中。
如果只修改子组件根节点的样式,还是可以写到父组件的scoped CSS里面,因为一个子组件的根节点会同时存在 两个data-v属性的,一个是父组件本来的,另一个是子组件根节点上面的;(见上图左边部分);所以也会影响到子组件的根节点元素。
4.父组件添加scoped,子组件也添加
子组件使用自己的样式,不受父组件影响。
解决办法,使用深度作用选择器
父元素使用/deep/或者>>>穿透?
sass之类的预处理器无法正确解析>>>,所以这种情况下用/deep/或者::v-deep取代
### 表单校验
问题:把cate_id改成id,prop也改成id,trigger为change,但是验证规则不消失????
content 对应quill-editor富文本编辑器,不是el提供的标签
el-input可以用trigger:blur校验
下拉框、下拉菜单、复选框都是在change事件时进行校验
富文本编辑器校验:要自己绑定校验事件,并且绑定的是change事件
### 前端读取图片以及传图片文件给后台
通过input[type='file']让用户选择文件,通过事件对象.target.files拿到用户选择的文件对象
前端需求:把图片通过src预览到页面,
1.把图片转成base64字符串:new FileReader()
给src赋予base64字符串的值,特点以data:image/png;base64,开头
2.文件转成图片链接地址:URL.createObjectURL(读取到的文件)
注意:此地址只能在前端使用,不能通过vue变量保存此值放到img标签里,只能通过对标签进行dom操作setattribute操作
后台需求:
1.base64字符串传递给后台
2.用new FormData()表单数据直接装读取到的文件本身,再传递给后台
### 后端返回图片
后端返回的图片不是完整图片路径
原因:服务器域名以后可能发生变化,所以数据库里的地址只有相对路径
要求:前端请求图片时,后端告诉你图片文件真身所在服务器域名,前端自己拼接前缀
问题:
组件创建时,会用data里的默认值,让template里的标签先渲染一次,
发送网络请求时,data里的数据会更新,template里使用此变量的dom也会更新
解决:
用v-if,有值的时候再渲染此dom
### 格式化时间
安装格式化时间第三方包
yarn add dayjs
// 基于dayjs封装一个全局函数来格式化时间(任意组件可以使用$formDate)
Vue.prototype.$formatDate = (dateObj) => {
// 借助dayjs内置方法把日期对象格式化为,并且把格式化的字符串返回到调用的
return dayjs(dateObj).format('YYYY-MM-DD HH:mm:ss')
}
### 分页使用
j
:page-sizes:
每次列表展示数据的条数
layout:
分页的布局,值分别表示:
总页数,条数/页,(prev+pager+next这三个属性是分页的基本属性上一页,页数,下一页),跳转到第几页
:total:指定总页数
属性.sync:
表示外部组件(elementui)与原生组件的data里的数据间双向绑定
### 打包项目
package.json:serve开启服务,打包项目,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
问题:打开index.html,出现了404问题
原因:
1.默认打包,index.js引入其他打包的文件用的是绝对地址
地址是以/开头,(当要找到index.html打开文件是所在服务器的根地址(文件夹))
要确保vscode+liveserver插件打开时,根目录是dist文件夹
如果把dist文件夹交给后台运维工程师部署到服务器上面,dist的内容就得在服务器的根目录上面才行
但是服务器一般会有多个项目,不让用根目录直接放一个项目
解决办法:
webpack会让你写一个配置项:pubicPath(控制index.js引入其它资源的前缀地址)
vue.config.js(脚手架配置文件,webpack配置文件)
publicPath:默认值 '/' 确保开发环境下是这个值,因为开发环境下,服务器会把所有打包在内存里面且作为服务器的根目录文件夹,绝对地址
生产环境,准备上线,这时就要用相对地址,publicPath:'./'
路径不以/开头,就是默认以./开头
项目中有些包不需要,所以不会打包到dist,所以dist的体积会比开发环境的小
但是还有一些外部组件比如elementui的包可以去掉
方法:
在vue.config.js里配置:
/////
### cdn
cdn全称Content Delivery Network 内容分发网络,我们用它来提高访问速度
把一些静态资源:css js 图片 视频 放在第三方cdn服务器上面,可以加速访问速度
unpkg.com
unpkg.com/:package@:version/:file