vue

136 阅读2分钟

vue使用和React

vue3 Option API 对应React class Component vue3 Composition API 对应React class Hooks

vue常见使用

  1. 插值、表达式

{msg} {3>2?2:1}

  1. 指令、动态属性

v-model :visible

  1. v-html:会有xss风险,会覆盖子组件

  2. computed和watch

computed: 是计算属性,依赖其它属性值,并且 computed 的值有缓存,只有它依赖的属性值发生改变,下一次获取 computed 的值时才会重新计算 computed 的值;

watch: 更多的是「观察」的作用,类似于某些数据的监听回调 ,每当监听的数据变化时都会执行回调进行后续操作;

watch:{
    name(oldVal,newVal){
        //引用类型拿不到,需要深度监听
        console.log("watch name",oldVal,newVal);
    }
    info:handel(oldVal,newVal){
        //引用类型拿不到,需要深度监听
        console.log("watch info",oldVal,newVal);
    },
    //深度监听
    deep:true
}
  1. class和style

使用动态属性,使用驼峰命名法

:class="{black:isBlack,yellow:isYellow}"
:style={styleData}

data(){
    return {
        isBlack:true,
        isYellow:true,
        styleData:{
        fontSize:'40px' //转换为驼峰式
        }
    }
}

  1. v-show和v-if
  • v-show是css样式显示和隐藏的切换
  • v-if是对条件的判断,对dom结构的渲染判断
  1. 循环(列表)渲染
  • v-for,key不能乱写
  • v-for和v-if不能一起使用!
  1. 事件
  • event参数,自定义参数 eg: ($event,val)
  • 事件修饰符,按键修饰符 eg: @click.stop @click.ctrl
@click=incre($event,val)
incre(event,val){
    console.log('event',event,event.__proto__.constructor) 
    console.log('event',event.target) 
    console.log('event',event.currentTarget) 
}
结论:1.event是原生的
     2.事件被挂载在当前元素

  1. 表单 v-model 常见的表单项 textarea checkbox radio select 修饰符 lazy number trim

vue常见使用

  1. prop和$emit
  • 父向子传参使用prop
props: { 
    father_string: 
        { type: String, 
          default: 'father'
        }
    }
  • 子向父传参使用this.$emit()
    //调用父组件的事件
    this.$emit('add',this.title)
  1. 组件间通讯-自定义事件
    //调用自定义事件
    event.$emit('onAddTitle',this.title)

  1. 组件生命周期

image.png

挂载阶段

  • beforeCreate(初始化界面前)

  • created(初始化界面后)

  • beforeMount(渲染dom前)

  • mounted(渲染dom后)

更新阶段

  • beforeUpdate(更新数据前)

  • updated(更新数据后)

销毁阶段

  • beforeDestroy(卸载组件前) 解除绑定,销毁子组件以及事件监听器

  • destroyed(卸载组件后)

父子组件的生命周期

  1. 加载渲染过程 父beforeCreate-> 父create -> 子beforeCreate-> 子created -> 子mounted -> 父mounted

  2. 更新过程 父beforeUpdate->子beforeUpdate->子updated->父updated

  3. 销毁过程 父beforeDestroy->子beforeDestroy->子destroyed->父destroyed

  4. 常用钩子简易版 父create->子created->子mounted->父mounted

vue高级特性

  • 自定义v-model 颜色选择器
   // 父组件
    <p>{name}</p>
    <Son v-model="name"></Son>
    data(){
        return {
        name:"zhangsan"
        }
    }
   // 子组件 颜色选择器
   <input type="text" 
           :value="text1"
           @input="$emit('change',$event.target.value)"
           >
   export default {
   model:{
       props: 'text1'//对应props的text
       event:'change'
   }
   props: { 
        text1:String,
        default(){
            return ''
        }
    }
   }
   
   //1.上面的input使用了:value,而不是v-model
   //2.上面的change和model.event要对应起来
   //3.text1属性对应起来
   
  • ref

    拿到当前的DOM节点方式

    <p  ref="url1">{name}</p>
  • nextTickvue是异步渲染,data改变之后,DOM不会立刻渲染,nextTick vue是异步渲染,data改变之后,DOM不会立刻渲染,nextTick会在DOM渲染之后被触发,以获取最新的DOM节点
//1.异步渲染,通过$nextTick待DOM渲染完后再回调
//2.页面渲染完成后会将data的修改做整合,多次data修改只会渲染一次
this.$nextTick(()=>{
    //获取DOM元素
    const urlElement =this.$ref.url1
    console.log(urlElement.childNodes.length)
})

  • slot 插槽,父组件向子组件插入值
  1. 基本使用
      //父组件
        <SlotDemo :url="website.url">
            {{website.title}}
        </SlotDemo>
          data() {
             return {
              website: {
              url: 'http://imooc.com/',
              title: 'imooc',
              }
           }
      //子组件
         <template>
         <a :href="url">
            <slot>
            //默认内容,即父组件没设置内容时,这里显示
            //接收的就是父组件的website.title
             </slot>
         </a>
         </template>
         <script>
         export default {
         props: ['url'],
        data() {
         return {}
        }
        }
        </script>
  1. 作用域插槽
         //父组件
        <ScopedSlotDemo :url="website.url">
            <template v-slot="slotProps">
            {{slotProps.slotData.title}}
            </template>
        </ScopedSlotDemo>
         //子组件
         <template>
         <a :href="url">
           <slot  :slotData="website">
               //默认值显示 subTitle ,即父组件不传内容时
              {{website.subTitle}}
             </slot>
         </a>
         </template>

  1. 具名插槽
        //定义具名插槽
        <slot  name="heard"> </slot>
         //使用具名插槽
         <NamedSlot>
          <template v-slot="heard">
            <h1>将插入 heard slot 中</h1>
            </template>
         </NamedSlot>
  • 动态、异步组件
  1. 动态组件 用法: :is="component-name"

应用:需要根据数据,动态渲染的场景。即组件类型不确定(课题详情页)

     <component :is="NextTickName"/>
     import NextTick from './NextTick'
     components:{
         NextTick
     }
     data() {
         return {
           NextTickName: "NextTick",
         }
     }
  1. 异步组件 使用:import()函数,按需加载,异步加载大组件

应用:客户内网,pc端后台管理,数据图表管理器组件,datav,echarts等

     //父组件
     <FormDemo v-if="showFormDemo"/>
     <button @click="showFormDemo = true">show form demo</button>
     showFormDemo: false
     
     同步是:
        import CustomVModel from './CustomVModel'
        import NextTick from './NextTick'
        import SlotDemo from './SlotDemo'
        import ScopedSlotDemo from './ScopedSlotDemo'
    异步是:
    components:{
         FormDemo: () => import('../BaseUse/FormDemo'),
         //等于
         FormDemo: () => {
             return import('../BaseUse/FormDemo')
         },
     }
  • keep-alive 缓存 使用:<keep-alive></keep-alive>

应用:缓存组件,频繁切换,不需要重复渲染,vue常见性能优化

  • mixin

  • 多个组件有相同逻辑,抽离出来,会有一些问题:变量不明确,可读性差;多个mixin 会造成命名冲突

  • vue3 提出的Composition API 解决了这个问题

    import myMixin from './mixin'
    export default {
        mixins: [myMixin], // 可以添加多个,会自动合并起来
    }
    -------------------
    //mixin.js
     export default {
        data() {
            return {
                city: '北京'
            }
        },
        methods: {
            showName() {
                console.log(this.name)
            }
        },
        mounted() {
            console.log('mixin mounted', this.name)
        }
    }

vuex使用

  • State:定义了应用状态的数据结构,可以在这里设置默认的初始状态。

  • Getter:允许组件从 Store 中获取数据,mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性。

  • Mutation:是唯一更改 store 中状态的方法,且必须是同步函数

  • Action:用于提交 mutation,而不能直接变更状态,可以异步,但不能直接操作State。

  • Module:允许将单一的 Store 拆分为多个 store 且同时保存在单一的状态树中。


  • dispatch
  • commit
  • mapState
  • mapGeeters
  • mapActions
  • mapMutations

vue-router使用

路由模式;hash,h5 history

路由配置:动态路由,懒加载

动态路由以冒号开头:id

    const user ={
        template:'<div>{{$route.params.id}}</div>'
    }
    const router = new VueRouter({
        routes: [
            { path: '/user/:id', component: SlotDemo }
        ]
    })

懒加载

    component:() => import('../BaseUse/FormDemo')