码迷,mamicode.com
首页 > 其他好文 > 详细

Vue进阶

时间:2020-02-22 00:27:30      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:单元素   标识   container   算法   元素   length   完成后   mic   wip   

一、Vue进阶内容

slot插槽(内容分发)

我觉得可以理解为模板,轮廓被组件建好了,内容可以填入插槽 .比如一个轮播图组件,功能完善了,图片需要通过插槽插入.

<div id="Box">    
    <swiper>
        <img v-for="data in datalist">
            {{data}}
        </img>
    </swiper>
</div>
<script>
    Vue.component("swiper",{
        template:`
        <div>
        我是轮播图
        <solt></solt>   //写入<swiper>内的内容会被插入到这里
        </div>`
    })
    var a =new Vue({
        el:"#Box",
 })
</script>

所有中内容都会插入子组件

特殊:具名插槽,可控制具体插入位置

<div id="Box">    
    <swiper>
        <div slot="a">aaaaaaaaaaa</div> <!--插入插槽a-->
        <div slot="b">bbbbbbbbbbb</div> <!--插入插槽b-->
    </swiper>
</div>
Vue.component("swiper",{
        template:`
        <div>
        <slot name="a"></slot>
        我是轮播图
        <slot name="b"></slot>
        </div>`
    })

transition过渡

1.单元素组件过渡

<style>
        .zzh-enter-active, .zzh-leave-active{
            transition: all 1.5s;
        }
        .zzh-enter, .zzh-leave-to{
            opacity: 0;
            transform: translateX(100px);
        }
</style>
<div id="Box">    
  <button @click="isshow =!isshow">click</button>
     <transition name="zzh">
        <div v-show="isshow">111111111111111111</div>
     </transition>
</div>
 data:{
            isshow:false
        }

关键帧写法

<style>
        .zzhbounce-enter-active{
            animation: bounce-in 1.5s;
        }
        .zzhbounce-leave-active{
            animation: bounce-in 1.5s reverse;
        }
        @keyframes bounce-in {
            0%{
                opacity: 0;
                transform: translateY(50px);
            } 
            100%{
                opacity: 1;
                transform: translateY(0px);
            }               
        }
</style>
<div id="Box">    
  <button @click="isshow =!isshow">click</button>
     <transition name="zzhbounce">
        <div v-show="isshow">222222222222222222</div>
     </transition>
</div>
 data:{
            isshow:false
        }

2.多元素过渡

<transition name="zzhbounce">
    <div v-if="isshow" key="1">222222222222222222</div>
    <div v-else="isshow" key="2">222222222222222222</div>
</transition>

transition标签内元素应该是单一的,我们在这里使用if-else使其互斥,通过设置不同key值使得相同标签也会被递归算法刷新.

同样的,动态组件也可以为其设置过渡动画

 <transition name="zzhbounce" mode="out-in">
      <component :is="which"></component>
</transition>

mode="out-in"标识先离开在进来

3.列表过渡transition-group,需要提供唯一key值

P44

生命周期

  • beforeCreate
  • created
  • beforeMount
  • mounted
  • beforeUpdate
  • updated
  • beforeDestroy
  • destroyed

过滤器

举一个猫眼电影的小栗子,事先准备好了test.json,需要axios

<div id="Box">    
    <ul>
       <li v-for="data in datalist">
          <h3>{{data.nm}}</h3>
          <img :src="changepath(data.img)" >
       </li>
    </ul>
</div>
 var a =new Vue({
        el:"#Box",
        data:{
            datalist:[]
        },
        methods:{
            changepath(path){
                return path.replace('w.h','170.230')
            }
        },
        mounted(){
            axios.get("test.json").then(res=>{
                console.log(res.data.coming);
                this.datalist = res.data.coming
            })
        }

这里并没有用过滤器,只是用了一个回调函数changepath()其中的path.replace(‘w.h‘,‘170.230‘)是因为猫眼电影处理了图片地址,由一个接口控制返回图片大小:

"http://p0.meituan.net/w.h/movie/2c109.jpg"

"http://p0.meituan.net/190.250/movie/2c109.jpg"

而使用过滤器呢?

<div id="Box">    
    <ul>
       <li v-for="data in datalist">
          <h3>{{data.nm}}</h3>
          <img :src="data.img | mypath"/>
       </li>
    </ul>
</div>
<script>

Vue.filter("mypath",function(path){
        return path.replace('w.h','170.230')
    })

 var a =new Vue({
        el:"#Box",
        data:{
            datalist:[]
        },
        mounted(){
            axios.get("test.json").then(res=>{
                console.log(res.data.coming);
                this.datalist = res.data.coming
            })
        }
</script>

img :src="data.img | mypath"使用了过滤器,当执行到这里时,会自动将data.img传入用定义好的Vue.filter里的function(path) 处理 ,并用返回值替换data.img, 只是为了高级

swiper组件封装

<div id="Box">    
    <swiper :key="datalist.length">
        <div class="swiper-slide" v-for="data in datalist">
            {{data}}     
         <!-- <img :src="data" />       -->
        </div>
    </swiper>
</div>
Vue.component("swiper",{
   template:`
        <div class="swiper-container a">
            <div class="swiper-wrapper">
               <slot></slot>
            </div>
            <div class="swiper-pagination"></div>
        </div> `,
        mounted(){
            new Swiper ('.a', {
                //direction: 'vertical', // 垂直切换选项
                loop: true, // 循环模式选项
                autoplay:true,
            // 如果需要分页器
                pagination: {
                el: '.swiper-pagination',
            }
            }) 
        } 
    })
    var a =new Vue({
        el:"#Box",
        data:{
            datalist:[]
        },
        methods:{
            changepath(path){
                return path.replace('w.h','170.230')    
            } 
        },
        mounted(){
            setTimeout(()=>{
                axios.get("test.json").then(res=>{    
   this.datalist = ["11111","22222","33333"] //数据输入位置
            },100)})    
          }
     })

自定义指令

 <div id="Box">    
    <div v-hello="'yellow'">111111</div>
    <div v-hello="'red'">222222</div>
    <div v-hello="mycolor">3333333</div>
 </div>
 <script>
    Vue.directive("hello",{
        inserted(el,bind){
            //指令的生命周期,当插入父节点时执行
            console.log("charu");
            //el可以拿到底层dom
            console.log(el);
            //等号后面输入的值是bind.value
            console.log(bind.value);
            //两者结合上色,一次性,上完就改不了了,要借助update
            el.style.background=bind.value
        },
        update(el,bind){
            //指令的生命周期,当内容更新时执行
            el.style.background=bind.value
        }
    })

    var a =new Vue({
        el:"#Box",
        data:{
            mycolor:"red"
        }
 })
</script>

有了指令,可以尝试做一下指令轮播

<div id="box">    
        <div class="swiper-container a">
        <div class="swiper-wrapper">
     <div class="swiper-slide" v-for="(data,index) in list" 
            v-swipe="{index:index,length:list.length}">
                {{data}}
        </div>
        </div>
        <!-- 如果需要分页器 -->
        <div class="swiper-pagination"></div>
        </div>
</div>  
<script>
        Vue.directive("swipe",{
            inserted(el,bind){   
                if(bind.value.index==bind.value.length-1){
                new Swiper ('.a', {
                //direction: 'vertical', // 垂直切换选项
                loop: true, // 循环模式选项
                autoplay:true,
                 // 如果需要分页器
                pagination: {
                el: '.swiper-pagination',
            }
            })}}
        })

    new Vue({
        el:"#box",
        data:{
            list:[]
        },
        mounted(){
           setTimeout(()=>{
               this.list=["111","222","333"]
           },100)}})
</script>

二、脚手架 Vue-cli

使用单文件组件和脚手架可以很简单的构建Vue组件

Vue-cli

安装完成后,按shift加右键在项目文件夹打开power shell,通过 vue create 项目名来新建一个项目,或者输入vue ui 通过图形化界面新建项目。完成后在vscode项目文件夹新建终端,输入:

npm run serve

服务启动成功后,通过浏览器访问,即可看到初始页面。

在main.js中可以看出,入口通过使用 import App from ‘./App.vue‘,将 所有样式、逻辑都在App.vue中引入了。于是我们去编写App.vue,基本语法如下:

<template>
  <div>
    hello world
    <input type="text" ref="mytext">
    <button @click="click_add()">add</button>
    <ul>
      <li v-for="data in datalist" :key="data">
          {{data}}
      </li>
    </ul>
  </div>
</template>

<script>
//ES6导出
export default {
  data(){
    return{
      datalist:[]
    }
  },
  methods:{
    click_add(){
      console.log("add");
      this.datalist.push( this.$refs.mytext.value)
    }
  }
}
</script>

<style lang="scss">
ul{
  list-style: none;
  padding-left: 0%;
  li{
   background-color: yellowgreen;
  }
}
</style>

当在多个组件中定义style时,通常使用scoped限定作用域为自己,防止样式相互影响。

<style lang="scss" scoped> //scoped局部作用域,当前样式只影响自己

通过npm run lint 格式化代码

通过npm run build 转换代码,成为一般html,css文件

反向代理,解决跨域

路由容器(插槽):

  • 路由机制 vue-router

1.配置router文件夹下的index.js文件,重要部分如下:

技术图片

2.在views中自己写3个组件,分别为Film\Center\Cinema

3.在APP中添加路由插槽,引入自定义的组件

技术图片

4.这时就可以通过控制路径动态控制插槽内容啦~

技术图片

在此基础上,我们可以优化一下

因为谁会智障到去改路径啊0-0

5.在components文件夹下新建一个组件Tabbar:

技术图片

新建好后在APP中引入该组件,然后使用就好啦~结果就是一个点中时高亮的标签切换bar~

Vue进阶

标签:单元素   标识   container   算法   元素   length   完成后   mic   wip   

原文地址:https://www.cnblogs.com/beibingji/p/12343667.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!