美文网首页
vue开发常用技巧总结(二)

vue开发常用技巧总结(二)

作者: 小话001 | 来源:发表于2020-09-11 18:01 被阅读0次
    6.refs与root
    // 父组件
    <home ref="home"/>
    mounted(){
      console.log(this.$refs.home) //即可拿到子组件的实例,就可以直接操作 data 和 methods
    }
    
    // 父组件
    mounted(){
      console.log(this.$root) //获取根实例,最后所有组件都是挂载到根实例上
      console.log(this.$root.$children[0]) //获取根实例的一级子组件
      console.log(this.$root.$children[0].$children[0]) //获取根实例的二级子组件
    }
    
    7.v-slot

    1.slot,slot-cope,scope 在 2.6.0 中都被废弃,但未被移除
    2.作用就是将父组件的 template 传入子组件

    //匿名插槽演示
    // 父组件
    <todo-list> 
        <template v-slot:default>
           任意内容
           <p>我是匿名插槽 </p>
        </template>
    </todo-list> 
    // 子组件
    <slot>我是默认值</slot>
    //v-slot:default写上感觉和具名写法比较统一,容易理解,也可以不用写
    
    //具名插槽演示
    // 父组件
    <todo-list> 
        <template v-slot:todo>
           任意内容
           <p>我是匿名插槽 </p>
        </template>
    </todo-list> 
    
    //子组件
    <slot name="todo">我是默认值</slot>
    
    //作用域插槽演示,子组件内数据可以被父页面拿到(解决了数据只能从父页面传递给子组件)
    // 父组件
    <todo-list>
     <template v-slot:todo="slotProps" >
       {{slotProps.user.firstName}}
     </template> 
    </todo-list> 
    //slotProps 可以随意命名
    //slotProps 接取的是子组件标签slot上属性数据的集合所有v-bind:user="user"
    
    // 子组件
    <slot name="todo" :user="user" :test="test">
        {{ user.lastName }}
     </slot> 
    data() {
        return {
          user:{
            lastName:"Zhang",
            firstName:"yue"
          },
          test:[1,2,3,4]
        }
      },
    // {{ user.lastName }}是默认数据  v-slot:todo 当父页面没有(="slotProps")
    
    8.路由传参

    方式一:

    //坏处:链接上暴露信息,丑陋
    // 路由定义
    {
      path: '/describe/:id',
      name: 'Describe',
      component: Describe
    }
    // 页面传参
    this.$router.push({
      path: `/describe/${id}`,
    })
    // 页面获取
    this.$route.params.id
    

    方式二:

    //坏处:页面刷新参数会丢失
    // 路由定义
    {
      path: '/describe',
      name: 'Describe',
      omponent: Describe
    }
    // 页面传参
    this.$router.push({
      name: 'Describe',
      params: {
        id: id
      }
    })
    // 页面获取
    this.$route.params.id
    

    方式三:

    //坏处:链接上暴露信息,丑陋
    // 路由定义
    {
      path: '/describe',
      name: 'Describe',
      component: Describe
    }
    // 页面传参
    this.$router.push({
      path: '/describe',
        query: {
          id: id
      `}
    )
    // 页面获取
    this.$route.query.id
    
    9.render函数
     //初级版 根据 props 生成标签,性能较低
    <template>
      <div>
        <div v-if="level === 1"> <slot></slot> </div>
        <p v-else-if="level === 2"> <slot></slot> </p>
        <h1 v-else-if="level === 3"> <slot></slot> </h1>
        <h2 v-else-if="level === 4"> <slot></slot> </h2>
        <strong v-else-if="level === 5"> <slot></slot> </stong>
        <textarea v-else-if="level === 6"> <slot></slot> </textarea>
      </div>
    </template>
    
    //优化版,利用render 函数减小了代码重复率,性能较高
    <template>
      <div>
        <child :level="level">Hello world!</child>
      </div>
    </template>
    
    <script type='text/javascript'>
      import Vue from 'vue'
      Vue.component('child', {
        render(h) {
          const tag = ['div', 'p', 'strong', 'h1', 'h2', 'textarea'][this.level-1]
          return h(tag, this.$slots.default)
        },
        props: {
          level: {  type: Number,  required: true  } 
        }
      })   
      export default {
        name: 'hehe',
        data() { return { level: 3 } }
      }
    </script>
    
    10.异步组件注册

    异步组件的渲染本质上其实就是执行2次或者2次以上的渲染, 先把当前组件渲染为注释节点, 当组件加载成功后, 通过 forceRender 执行重新渲染。

    // 工厂函数执行 resolve 回调
    Vue.component('async-webpack-example', function (resolve) {
      // 这个特殊的 `require` 语法将会告诉 webpack
      // 自动将你的构建代码切割成多个包, 这些包
      // 会通过 Ajax 请求加载
      require(['./my-async-component'], resolve)
    })
    
    // 工厂函数返回 Promise
    Vue.component(
      'async-webpack-example',
      // 这个 `import` 函数会返回一个 `Promise` 对象。
      () => import('./my-async-component')
    )
    
    // 工厂函数返回一个配置化组件对象
    const AsyncComponent = () => ({
      // 需要加载的组件 (应该是一个 `Promise` 对象)
      component: import('./MyComponent.vue'),
      // 异步组件加载时使用的组件
      loading: LoadingComponent,
      // 加载失败时使用的组件
      error: ErrorComponent,
      // 展示加载时组件的延时时间。默认值是 200 (毫秒)
      delay: 200,
      // 如果提供了超时时间且组件加载也超时了,
      // 则使用加载失败时使用的组件。默认值是:`Infinity`
      timeout: 3000
    })
    

    相关文章

      网友评论

          本文标题:vue开发常用技巧总结(二)

          本文链接:https://www.haomeiwen.com/subject/lcqtektx.html