Vue小笔记8-27

112 阅读3分钟

插槽

  • slot插槽标签,可以在组件中预留一个位置,使用该组件后,可以动态的插入需要的内容到插槽中
  • slot具名插槽,可以在模板标签中留一个slot属性,这个属性可以指定渲染插槽内容不会混淆,重复渲染
	<script type="text/javascript">
		Vue.component("child",{
			template:`<div>
				<slot name="a"></slot>
			</div>`
		})
	</script>
    <html>
        <div slot="a">aaaaaaaaaaaa</div>
    </html>
  • slot插槽可以解决作子父组件的用域问题,组件标签在模板中,也就是在父组件的作用域中,所以可以访问到父组件的状态
	<body>
		<div id="app">
			<navbar>
				<button type="button" @click="isShow=!isShow">navbar组件click</button>
			</navbar>
			<sidebar v-show="isShow"></sidebar>
		</div>
	</body>
	<script src="../1day/vue.js" ></script>
	<script type="text/javascript">
		//子组件
		Vue.component("navbar",{
			template:`
			<div>
				<slot></slot>
			</div>
			`,
			
		})
		//子组件
		Vue.component("sidebar",{
			template:`<div>
				<ul style="background-color:pink;width:220px;">
					<li>1111111</li>
					<li>2222222</li>
					<li>3333333</li>
				</ul>
			</div>`
		})
		
		const vm = new Vue({
			el:'#app',
			data:{
				isShow:false
			}
		})
	</script>
</html>

动画效果

  • 单元素/组件过度

    • css过渡
    • css动画
    • 结合animate.css动画库
  • 多个元素过渡(设置key)

    • 当有相同标签名的元素切换时,需要通过key特性设置唯一的值来标记以让Vue区分他们,否则Vue为了效率只会替换相同标签内部的内容 mode:in-out;out-in
  • 多个组件过渡

  • 列表过度(设置key)

过滤器

<img :src="data.img | mypath" />
vue解析的时候会通过管道符把原始的数据,传递到


Vue.filter("mypath",function(data){
	return data.replace('w.h','100,200')
})

vue cli

  • 使用 npm install -g @vue/cli(一次安装)node-sass需要单独处理

    • vue create myapp (创建自己的vue开发文件
      • npm run serve 开发环境运行
      • npm run build 生成环境构建
      • npm run lint 代码检测工具
  • 关闭eslint的方法:

    • 在cli4.5中关闭的方法就是在根目录创建一个vue.config.js文件
    	module.exports = {
            lintOnSave: false
        };
    

style标签加上 scoped属性后,css就会局部生效 style标签加上 lang="scss" 支持scss

  • 反向代理

    在发请求的过程中会涉及到跨域问题,由于有的服务器做了域名限制,所以我们需要开启方向代理来帮我们解决这个问题

module.exports = {
  devServer:{
    proxy: {
      '/ajax':{
        target:'https://m.maoyan.com',
        changeOrigin:true
      }
    }
  }
}
# 只要是/ajax的请求,都会代理到target指定的域名上

vue 路由

  • vue中的根路径(src)可以是@代替
	import Hwbar from '@/components/Hwbar'
  • ruoter-view存放路由访问的视图页面
	<router-view/>
  • ruoter-link里面的tag可以生成指定的标签,to是路径
    • 它还有一个属性 active-class 可以监听路由,然后动态给它加上类名 (声明式导航)
	//不管tag生成什么标签,都是可以跳转的
  <router-link to="/Center" tag="li">center</router-link>
  <router-link to="/Film"  active-class="myactive">film</router-link>
  • 路由重定向,当路由路径都不符合的时候,会自动跳转到我们设置好的路径去
	{
    path:'*',
    redirect:'/Center'
  }
  • 二级路由
 {
    path: '/Film/nowplaying',
    component: Film,
    children:[
      {
        path:'/Film/nowplaying',
        component:Nowplaying
      },
      {
        path:'/Film/comingsoon',
        component:Comingsoon
      }
    ]
  },
  • 动态路由,可以动态的生成路径,跳转后的页面,也能取到值
# 路由
 {
    path: '/detail/:myId',
    component: Detail
  }
  
 # 跳转页面
  methods:{
    handleChangePage(e){
      this.$router.push(`/detail/${e}`)
    }
  }
  
  # 接收页面
  mounted(){
        this.dataInfo = this.$route.params.myId
    }
  • 路由命名
# 定义路由名称
 {
    path: '/detail/:myId',
    name:'myRuote', // 通过自定义的方式定义路由
    component: Detail
  }
  
  # 跳转页面
  methods:{
    handleChangePage(e){
      this.$router.push({name:'myRuote',params:{myId:e}})
    }
  }
  
  # 接收页面
  mounted(){
        this.dataInfo = this.$route.params.myId
    }
  • vue数据二次循环渲染

    • 方法1 可以使用,类似微信小程序得写法,在循环渲染的数组种,再循环渲染一次数据。
    <ul class="i-list" v-for="item in dataList" :key="item.filmsId">
        <li class="i-item">
              <p class="star">主演:<a v-for="item2 in item.actors" :key="item2" >{{item2.name}} </a></p>
      	</li>
    </ul>
    
    • 方法2 利用管道符,把数据过滤,然后再渲染
      <p class="star">主演:<a >{{item.actors | actorfilter}} </a></p>
      
      import Vue from 'vue'
    
      // 利用管道符做数据过滤
      Vue.filter("actorfilter",function(data) {
        let newlist = data.map(item => item.name)
        console.log(newlist);
        return newlist.join("、");
      })
    
    • 当前页面定义的事件监听,当切换页面后需要关闭可以使用 beforeDestroy()这个生命周期函数
    mounted(){
    //监听事件
      window.onscroll = this.handleScroll;
    },
    beforeDestroy(){
    //关闭事件
      window.onscroll = null;
    },