最近问题总结

发布时间 2023-03-29 11:35:47作者: liweiook
  • vue中换行需要 {{'字符串\n'}},且需要添加white-space:pre-wrap;或\u00a0

  • vue中如果要写行内动态背景图片,需要用require引入图片,因为图片经过了webpack打包,如果直接用url引入的话,会找不到图片。img标签不用。

:style="{ backgroundImage: `url(${backgroundImg})`
computed: {
    backgroundImg() {
      return require(`@/assets/images/measure-icon/${this.imgName}.png`)
    }
}

文本溢出隐藏overflow: hidden;white-space: nowrap;text-overflow: ellipsis;然后隐藏的元素上加上title='隐藏的文本'。这样就能悬浮后显示文本了。

文字渐变:background-image:渐变。color透明, background-clip: text;

text-align:center可以设置图片水平居中;display:flex;align-item:center;可以垂直居中

文字和图片在同一行显示可能不对齐。在字体的标签上设置vertical-align: middle;或者设置文字基线

当ppt这种需要展示的东西展示的时候,可以给背景虚化,以减少干扰。

是否全屏 window.onresize = () => {

// 可视区域的高度

const clientHeight =

​ document.documentElement.clientHeight || document.body.clientHeight

// screen是window的属性方法,window.screen可省略window,指的是窗口

this.isFullScreen = screen.height === clientHeight

}


vue请求异步数据传给子组件 异步请求回来的数据,如果数据不会变,只是用作展示。data不用写在return里,可以写在return外面。这样vue就不会监听data。

但是这个data由于没有响应式,所以也不会被子组件watch到。可以在return中声明一个show属性,让子组件v-if:show在data拿到后再渲染。不能v-if:data.legth!=0。因为data没有响应式。

this.data = newData

this.chartShow = true


setToken如果没有存值或存的不是字符串,则token结果为字符串undefined

1.6

vue模板中\n换行符不生效可以用white-space:pre-wrap

11.22

前端正向代理和nginx反向代理

例如:

 '/modelService1/': {
      target: 'http://192.168.11.144:3001/',
      changeOrigin: true,
      pathRewrite: {
        'modelService1/': '',
      },

前端正向代理:存在于开发环境,解决跨域问题。虚拟服务器地址为http://localhost:8000/ 。想要的资源为http://192.168.11.144:3001/3dtiles/pf4dzjrph/tileset.json。如果直接填写这个地址,浏览器不让发送请求。于是发送http://localhost:8000/modelService1/3dtiles/pf4dzjrph/tileset.json。代理服务器匹配到modelService1,转发给http://192.168.11.144:3001/3dtiles/pf4dzjrph/tileset.json,即拿到这个地址的资源或者这个地址为nginx的代理服务器,ningix再次代理给真实服务器。

nginx代理:存在于线上环境,一是因为前端代理了,后端也需要代理。二是解决资源分布问题。当再线上环境时,发送的请求为:http://10.32.11.102/modelService1/3dtiles/pf4dzjrph/tileset.json。nginx匹配到:modelService1. nginx上也有一个类似前端配置代理的文件记录真实服务器地址,于是发送:http://192.168.11.144:3001/3dtiles/pf4dzjrph/tileset.json。

12.14

如果用less了

css中用 url('~@/assets')

img中用 src="~@/asssets"

动态style :style={fontSize:num+'px'},注意需要加 : 小驼峰 可以使用变量 px

计算属性 是属性使用不加()

12.25

行内元素不可以设置宽高和上下内外边距。浮动和定位后行内元素会变成块级元素。img是行内块元素

11.1

const Tc = connect(({ riskMonitoring }) => ({
  zongOpen: riskMonitoring.zongOpen,
}))(Index);
const IndexRef = forwardRef((props, ref) => <Tc {...props} refInstance={ref} />);

原本是(props,ref) => (props) {refINstance}=props

connect和forwardRef一起用

11.3

正向代理和反向代理

https://cloud.tencent.com/developer/article/1418457

正向代理设置在客户端,反向代理设置在服务器端

less background:url('@{asssets}/image/')

react 如果接受的props改变了,整个组件重新渲染。antd中的switch重新渲染,checked会重新执行。

11.4

数据库编目:表的字段信息上传到irs系统,新增目录。

数据归集:表的数据同步。

11.18

  1. 如果每次显示页面,发现先显示上一个页面的数据,然后页面在渲染程这个页面的数据。说明在页面渲染之后redux的数据才改变。
  2. 维护一个多状态的可以用数组。更具index改变状态

11.10

transition 可以设置过渡效果需要有开始状态和结束状态。如果元素一开始不存在,那么设置过渡效果无效。

animation 过渡效果通过定义关键帧实现。

如果元素一开始不存在,点击按钮时元素显示,这时如果添加过渡效果,需要先等元素显示后再改变过渡属性。

10.10

Vue.use(message)页面刷新自动触发;应该使用vue.prototype.$message;

includes; string.includes

filtter filtter是返回有满足条件return ture的item数组

map map是将每一个item映射

/services proxy做代理时别忘了加 /

export 抛出变量需要用{}包裹,default可以抛出一个变量。不可以解构。

登录后有token,路由跳转有token可以放行,且如果跳转登录页直接到首页。如果没有token,到登录页。

登录返回动态路由。遍历加入router字典,存入vues。页面刷新动态路由消失,导致刷新后无法跳转。所以每次跳转前先判断有没有动态路由。

需要存到vuex的接口,写在store中。比如动态路由。

权限涉及到token,用户信息,动态路由。且这三者都需要存到vuex中。

permission.js store/index.js router/index.js

浏览器控制台的结果先于axios的封装结果

axios中post的两种方式 params:拼接在url中的键值对 data:对象。request.post默认data。

reques.get(url,{params:params}) request({url,mehtods,params:params,})

request.post(url, params, {params:params})

注意post有两种请求方式,一种即get那种把参数拼接到url中的,一种是放在请求体中的,如果放在参数中,第二个位置需要设置为null,第三个位置放参数

请求头中可以也只请求类型,axios默认请求类型是application/json;一种键值对结构。还有一种是application/x-www-form-urlencoded;

https://blog.csdn.net/yangyangkl123/article/details/109024222

https://blog.csdn.net/xiaofeiwei521/article/details/123409954

10.13

axios.create创建实例,request.js抛出实例。

axios。defaults.headers

实例.interceptors.request/response.use((config/res)=>{},err=>{})

读取public下的json文件用axios

async await用try catch捕获错误

string -> number parseInt(string,string的进制数), string-0 不能用string+0,变成string0,可以+string

10.14

num.toFixed(2) 返回一个string

vue-router next()放行 next("/")中断当前路由跳转到'/'

next({...to,replace:true})addrouters后在跳转路由

对象配置/策略模式

Map 更好的对象 [["a", 1], ["b", 2], ["c", 3]]

map.set("key","value") map.get("key")

Object.entries(obj)

for (let [key, value] of iterable) {
  console.log(value);
}

Set 键唯一的数组 set.add('value')

缓存:浏览器缓存:storeg,cookie

http缓存:强缓存:如果有Cache-control:max-age=10。则10s内都去内存或磁盘中读文件。不向服务器发请求。

协商缓存:如果Cache-control last-modified:最后修改时间。仍然向服务器发请求看文件是否改变,如果改变则返回新文件,如果没改变则304去读缓存。

10.18

this.$set(this.student,"age",24)

// 比较两个对象是否相等  用continue
function diffObjectByKeys(obj1, obj2) {
  let isEqual = true;
  for (let key in obj1) {
    let v = obj1[key];
    if (obj2[key] && obj2[key] === v) {
      continue;
    } else return false;
  }
  return isEqual;
}

::v-deep .class

.class .class 和.class,.class

flex-direction justify-content

10.20

css filter可以控制图片的颜色

a表面href="javascript:void(0)"

data-name element.dataset.name

一次性导入文件 let files=require.context(文件路径,是否遍历子目录,匹配文件正则) files是一个对象,{./user.js : value} value.default拿到文件抛出的东西

10.26

useRecude,useCallback

假如父组件中渲染一个值,父组件传给子组件一个方法可以改变这个值,子组件中不需要渲染这个值但可以改变这个值。当子组件改变这个值后,父组件因为用到了这个值所以需要重新渲染,然而虽然子组件没有用到这个值,但是它是在父组件中的,所以也重新渲染了,实际上子组件是不需要重新渲染的,这样就造成了性能问题。

解决方法:

1.如果用MemoChild=React.memo(child),也是无法解决问题的,因为父组件重新渲染后传给子组件的方法也重新生成了,导致子组件的props改变了,所以child还是会重新渲染。不过不用React.memo不管props变没变,当父组件重新渲染时,子组件都会重新渲染。

还需要用useCallback将父组件传给子组件的方法包裹一下,把这个方法的引用缓存住,当这个方法只依赖一个state时,可以用setState(count=>count+1)这个方法让useCallback的依赖消失,这样这个方法就不会改变,子组件也就不会重新渲染了。但是如果传给子组件的方法依赖了多个state,那么useCallback就需要声明多个依赖,当依赖改变时方法就会改变,导致子组件仍然会重新渲染。

2.如果用useReduce,因为useReduce返回的dispatch的引用在父组件重新渲染时不会改变,所以就不需要用useCallback缓存方法了。即useCallback将多个依赖给隐藏起来了,依赖少子组件的重新渲染次数就少。

const [state,changeCount]=useReduce(countReducer,{count:0})
       状态   dispatch              reducer     初始状态
const countReducer=(state,action)=>{
    switch (action.type){
        case 'INCREASE':
            return {...state,count:state.count+action.data}
    }
}
const increaseCount=()=>{
    changeCount({type:'INCREASE',data:1})
} 
<child changeCount={changeCount} />
    changeCount不会改变

useState每次渲染生成不同的state,useRef每次渲染用的是同一个ref。

如果用到了多个依赖,但是不声明多个依赖,后造成闭包问题无法更新。

父组件传方法给子组件时可以包一层:当子组件调用handleIncrease时,就相当于调用setCount(count=>count+1)。如果只传setCount的话,还需要把count传过去。

  const handleIncrease = () => {
    setCount(count => count + 1);
  };

子改变父状态:父组件可以把属性和状态传给子组件,子组件通过调用父组件的方法改变父组件的状态。

父改变子:父组件通过child=useRef,ref={child},child.current拿到子组件的引用,从而拿到子组件的方法改变子组件的状态。

class组件多次渲染维护的是一个状态,而function每次渲染都会重新生成状态,导致函数组件re-render前后其中的函数和引用类型变量时不相等的,这会导致不必要的re-render。

useCallback返回接收的函数,useMemo会调用接受的函数,返回接受函数返回的结果。

如果一个结果需要通过耗时的函数返回可以用useMemo包裹。或者一个引用类型可以同useMemo包裹。

+++

ctrl+backspace删除一个单词

ctrl+shift+.打开面包屑 上下左右和ctrl+左右

f2 ctrl+g : @

--dirname 当前文件所在的绝对路径