同步操作将从 ice19/vue3_yiliao_92 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
为什么会修改不了样式?问什么需要深度选择器?
A组件里面引入了B组件,A组件想修改B组件内部的样式,就会有这个问,不管B组件是自定义的或者第三的
在我们自己封装的组件里面,如果要修改vant的组件的样式,如果有scoped,就会给下面的类名,加一个属性选择器 , 例如.van-nav-bar__text[data-xxx-ssss] 和vant的样式就匹配不到了,就不能修改样式
这个时候,我们需要在自己组件的scope的style里面,通过:deep()
这个深度选择器语法,去告诉编译器,下面的类名不要给我加 [data-xxx-xx]
这种属性选择器,就可以直接找到vant组件对应的 class类名
如果深度选择器不会用,也可以在当前页面在写一个不带scope的style,里面直接写vant组件库的样式就可以了。但是这样写会覆盖其他地方这个组件的样式,不是很好
:deep() {
.van-nav-bar {
&__text {
// 这个颜色要用主题色, 用css变量,通过var去引入
color: var(--hm-92-main-clor);
}
}
}
<style lang="scss">
.van-nav-bar__text {
color: red
}
</style>
百度自己去搜索: 基线、底线、顶线、中线、行距、行高
人资里面使用的element-ui的el-form表单
之前还使用vue3写过一些h5的项目,使用的是vant-ui里面的 van-form
可以手动的通过localStorage,sessionStorage,cookie进行储存,但是获取和设置都要单独的写代码,还要针对储存的数组和对象进行字符串的处理,比较麻烦。工作里面都是用插件来
import createPersistedState from "vuex-persistedstate"
const store = new Vuex.Store({
// ...
plugins: [createPersistedState({
storage: window.sessionStorage
})]
})
export const useUserStore = defineStore(
'user',
() => {
const user = ref<User | undefined>()
// // 设置用户的信息
const setUser = (e: User) => {
user.value = e
}
return { user, setUser }
},
{
// 下面是持久化的配置
persist: true
}
)
:disabled="time > 0"
if (time.value > 0) return
, 如果大于0就直接退出函数,怎么样在工作里面去快速的搭建一些静态。 面试官说:我的css html非常的扎实,能够快速的搭建一些静态页面。
之前在上一个项目里面,我做过一个h5的vue3项目,当时采用的是vant-ui + ts +vue3
我自己搭建静态页面有自己的一些技巧:我会首先根据ui的同事给的设计稿,
大致的看一下页面的响应式布局,采用vw,vh还是rem,在采用不同的postcss插件。
具体的页面布局,我是从上到下,按模块写多个div,然后在给他们加上背景颜色,方便查看div元素的位置。
然后我在整个页面大致看一眼,结合main.scss,看那些需要写css变量,哪些需要覆盖vant的组件库,哪些需要自己定义组件
如果是具体的布局,那么首先想到的是flex布局,float浮动,通过clearfix清除浮动。一些微小的定位调整,就是通过postions子绝父相来完成
如果有需求需要去修改vant-ui的样式,可以通过深度选择器去修改, 也可以通过写两个style,一个不加scoped一个加上。然后就可以针对与当前组件定制化自己的页面样式
如果有些样式是vant-ui自带的,那么我们在写代码的时候,就会直接用vant-ui提供的一些类型辅助我们开发,减少重复的css
然后写静态页面涉及到重复的内容,就通过v-for 数字循环,渲染多个相同的静态结构
写h5项目的时候,一定要注意的及时 假数据和后端返回的数据长度可能不一样,可能会破坏我们自己的布局模式,所以需要 对超出长度的部分,通过css展示小数点,保证样式问题
在布局一个有多种状态的页面时,我会先把 激活和未激活的样式 都全部写出来,然后在自己定义一个active变量,将页面上的结构动态的显示和隐藏,给激活的div上面添加一个active类名,判断条件就是active的值和v-for循环的值进行对比。
我之前经常封装组件,稍微复杂一些的是 涉及到父子孙组件传值
在上一个项目里面,我写了一个父子组件,但是子组件里面又引入了一个公共的头部组件,在子组件里面点击头部组件的返回按钮时,涉及到 孙组件向子组件抛出一个事件, 然后子组件再想父组件抛出一个事件,最后把父组件的一个数据进行修改。
有些时候,组件的状态和服务器接口需要的值不一样,就需要使用计算属性的get set
之前我做过一个项目,有一个复选框选择的UI界面, 组件的值默认是true和false。但是服务器接口需要的值是 0 和 1,为了后面发请求方便,所以需要使用计算属性的get和set。 get函数里面返回的是true和false,控制复选框的勾选和取消。 set函数就是去设置服务器的接口需要的数据 0 和 1
在vue3里面只有v-model没有sync
v-model的默认的语法糖,以前是value属性+input事件。 现在vue3边长了默认的 modelValue属性 + update:modelValue 事件
一个组件上面可以使用多个v-model,vue2是不可以的,只能用sync来代替。 多个v-model的写法就是 v-model:count="xxx" v-model:msg="xxxxx"
通过两个函数 useRoute 和 useRouter来实现
在模板里面可以直接使用$route 和 $router
之前我做过小程序里面的微信支付。 还写过一个h5的医疗项目, 里面涉及到支付,我们的后端支持的是支付宝支付。主要的难点我觉得都在后端,前端的话只需要调用两个接口就好了。
具体的接口,一个核心就是 订单id。 生成这个id的时候,前置工作准备的参数比较多。是否使用优惠券,优惠券的id需要传递,患者的个人信息的id,选择的意思的科室,之前是否就诊过,就诊时间是多久之前,医生开的处方药品合集,补充的病例图片,还有很多,记住的比较核心就这几个。 发请求给我们的后端,得到一个订单id
在就是调用公司后端服务器写的 支付接口,对于前端而言,只需要准备几个参数就可以了,最核心的就是订单id。 然后还有回调地址(支付成功以后支付宝页面跳转的地址)
沙箱环境(后端测试的时候,有一个沙箱环境的账号)
http协议: 单向
只能是客户端发请求, 服务器在被动的给你响应,给你返回值
三次握手 四次挥手---- 面试题
websocket协议 : 双向的
服务器和客户端可以双向的发数据,(淘票票买电影票,股票,一些抢购商品的数量动态变化)
轮询 (短轮询,长轮询,短连接,长链接)
setInterval(async () => {
await getCount()
}, 500)
这样也可以实现动态的效果
缺点: 1. 接口返回的数据还是有时效性问题,
2. 浪服务器的资源,增加公司服务器的成本
https://heapdump.cn/article/3828298
1. 什么是socket.io
就是一个基于websocket协议封装的一个库,后端基于这个库去创建一个 websocket的服务
前端通过socket.io-client去链接后端提供的这个服务
2.怎么样去写页面?
我之前写过一个非常复杂的项目,涉及到聊天室,会根据产品原型图和UI设计稿,先将整个聊天界面大致拆分为三四个组件,核心的聊天框里面再拆分几个子组件。
在消息的组件里面,会将UI图上画的所有对话的情况都写一遍,写成静态结构,然后在组件里面,通过传递的item选项,动态控制要显示那一条消息
相关核心
io('地址')
connect
emit
+ 事件on
+ 事件close()
枚举
简历上面: 可以熟练的使用socket.io 进行一些聊天的业务开发
别人问你的具体的:
(时刻注意: 我们这个代码,是两个端再用,患者用手机看这个项目,医生也用手机在看这个项目。 )(直播的项目 一套代码针对多个角色: 主播,助理,嘉宾,游客)
<template>
<div>当前鼠标位置</div>
<div>x: {{ mouse.x }}</div>
<div>y: {{ mouse.y }}</div>
<div>当前点击次数:{{ count }}</div>
<button @click="add">点击</button>
</template>
<script>
export default {
// vue2 中采用的是 options API
// 常见的配置项: data created methods watch computed components
data() {
return {
mouse: {
x: 0,
y: 0,
},
count: 0,
}
},
mounted() {
document.addEventListener('mousemove', this.move)
},
methods: {
move(e) {
this.mouse.x = e.pageX
this.mouse.y = e.pageY
},
add() {
this.count++
},
},
destroyed() {
document.removeEventListener('mousemove', this.move)
},
}
</script>
组合式Api写法
<template>
<div>当前鼠标位置</div>
<div>x: {{ mouse.x }}</div>
<div>y: {{ mouse.y }}</div>
<div>当前点击次数:{{ count }}</div>
<button @click="add">点击</button>
</template>
<script>
import { onMounted, onUnmounted, reactive, ref } from 'vue'
export default {
setup() {
const count = ref(0)
const add = () => {
count.value++
}
const mouse = reactive({
x: 0,
y: 0,
})
const move = (e) => {
mouse.x = e.pageX
mouse.y = e.pageY
}
onMounted(() => {
document.addEventListener('mousemove', move)
})
onUnmounted(() => {
document.removeEventListener('mousemove', move)
})
return {
count,
add,
mouse,
}
},
}
</script>
抽离代码
App.js
import useMouse from './mouse'
import useCount from './count'
export default {
setup() {
const mouse = useMouse()
const { add, count } = useCount()
return {
count,
add,
mouse,
}
},
}
mouse.js
import { onMounted, onUnmounted, reactive, } from 'vue'
function useMouse() {
const mouse = reactive({
x: 0,
y: 0,
})
const move = (e) => {
mouse.x = e.pageX
mouse.y = e.pageY
}
onMounted(() => {
document.addEventListener('mousemove', move)
})
onUnmounted(() => {
document.removeEventListener('mousemove', move)
})
return mouse
}
count.js
import { ref } from 'vue'
function useCount() {
const count = ref(0)
const add = () => {
count.value++
}
return {
count,
add,
}
}
https://juejin.cn/post/6997172216211177502
总结: option api 编写的代码相对比较分散,不利于后期的维护和抽取(代码复用)
composition api 可以将option api的代码增合到一起,增加了代码的可读性和可复用性
同时 方便代码的抽离,可以将代码抽离成为一个个的hook函数,以提高代码的可复用性
useClipboard, useLocalStorage, useMouse,
https://juejin.cn/post/7133134643284410376
https://www.vueusejs.com/guide/ 中文官网
可以和面试官面试的话:提前准备
熟练的对接第三方登录, 例如qq登录,微信登录 ----写简历上面
涉及到QQ互联 里面注册一个应用,核心就是 获取 access token,然后就是获取用户openID,调用openAPI去访问用户的信息,比如昵称头像等
具体落实到代码层面,就是在index.html里面, scirpt标签引入 qq的sdk的文件,里面传递应用appid,和登录成功以后的回调地址redirecturl
最后在vue的登录组件里面,使用全局变量QC 核心方法就是getMe方法,获取qq用户的信息
精通移动端开发的调试 --- 写到简历上面去
v-console --- 在手机上浏览器的网页 --- 看不到请求,需要使用这个包,就可以在手机右下角多一个按钮,点击出来和浏览器的控制台长的比较像,有elemnt network localstoreg等等
eruda --- 这个和上面的是一样的, 只不过这个是国外的,vConsole是腾讯出品的
mock -- 前端写完了,后端接口还没有写好。 用mock写假数据
postman --- 后端写完了,前端有些页面还没有写,前端或者后端,就通过postman去测试接口
fiddle --- 抓包 (场景: 如果是要调试 写在APP里面的 网页,那么就可以使用这个工具)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。