• Vue框架学习(四)


    项目初始化

    """
    1)根组件:App.vue
    <template>
        <div id="app">
            <router-view />
        </div>
    </template>
    
    2)路由配置:router/index.js
    const routes = [
        {
            path: '/',
            name: 'Home',
            component: Home
        }
    ];
    
    3)组件:views和components文件夹
    	i)删除除Home.vue以为的所有组件
    	ii)初始化Home.vue
    	<template>
            <div class="home">
            </div>
        </template>
    
    4)分类管理资源:assets文件夹
    	建立img、css、js子文件夹,删除原来的资源
    	
    5)如果要修改页面标签图标
    	替换public文件夹下的favicon.ico图片文件
    """
    

    组件数据局部化处理

    """
    1)不管页面组件还是小组件,都可能会被多次复用
    2)复用组件的原因,其实就是复用组件的 页面结构、页面样式、页面逻辑
    3)但是页面上的数据需要区分(被复用的两个组件数据多少是有区别的),所以组件的数据要做局部化处理
    4)借助函数可以产生局部作用域的特点,为每一次复用组件产生一个独立的作用域
    语法:
    data () {
    	return {
    		// 数据们
    	}
    }
    """
    

    一、组件之间的数据传递

    1.父组件向子组件传递

    子组件需要向父组件提供一个接口,父组件通过这个接口可以对子组件进行设置。这个接口就是子组件Vue对象中的props实例成员。

    子组件在props注册的属性名,父组件可以在使用组件标签的时候通过属性的方式进行赋值。

    子组件Goods.vue

    <template>
    	<div class="goods" style="text-align: center;" @click="clickGoods(pk,desc)" :pk='pk'>
    		<img :src="img_url" alt="">
    		<p>{{ desc }}</p>
    	</div>
    </template>
    
    <script>
    	export default{
    		props:['img_url','desc','pk'],
    	}
    </script>
    

    父组件Shop.vue

    <template>
    	<div class="Shop">
    		<h1>选择了{{ goods_name }}商品</h1>
    		<div>
    			<Goods v-for='goods in goods_list' :img_url='goods.img_url' 
    			:desc='goods.desc' :pk='goods.id'>
    			</Goods>
    		</div>
    	</div>
    </template>
    
    
    <script>
    import Goods from '@/components/Goods.vue'
    let goods_list =  [
    	{
    		img_url :require('@/assets/img/1.jpg'),
    		id:1,
    		desc:'二狗子'
    	},
    	{
    		img_url:require('@/assets/img/2.jpg'),
    		id:2,
    		desc:'三狗子'
    	},
    	{
    		img_url:require('@/assets/img/3.jpg'),
    		id:3,
    		desc:'四狗子'
    	},
    ] 
     export default{
    	 data(){
    		 return {
    			 goods_list,
    			 goods_name:'未知',
    		 }
    	 },
    	 components:{
    		 Goods,Nav
    	 },
     }
    </script>
    
    
    2.子组件向父组件传递数据

    子组件在父组件渲染之后开始渲染,子组件需要自定义方法在某个特别的时间节点向父组件传递信息。当子组件发生时间时,可通过$emit向父组件发送通知、还可以传递参数。

    goods.vue

    <template>
    	<div class="goods" style="text-align: center;" @click="clickGoods(goods.title)" >
    		<img :src="goods.img_url" alt="">
    		<p>{{ goods.title }}</p>
    	</div>
    </template>
    
    <script>
    	export default{
    		data(){
    			return {
    				
    			}
    		},
    		props:['goods'],
    		methods:{
    			clickGoods(title){
    				this.$emit('clickGoods',title)
    			}
    		}
    	}
    </script>
    

    Shop.vue

    <template>
    	<div class="Shop">
    		<h1>选择了{{ goods_name }}商品</h1>
    		<div>
    			<Goods v-for='goods in goods_list' :goods='goods' @clickGoods='chooseGoods'>
    			</Goods>
    		</div>
    	</div>
    </template>
    
    <script>
    import Goods from '@/components/Goods.vue'
    let goods_list =  [
    	{
    		img_url :require('@/assets/img/1.jpg'),
    		id:1,
    		title:'二狗子'
    	},
    	{
    		img_url:require('@/assets/img/2.jpg'),
    		id:2,
    		title:'三狗子'
    	},
    	{
    		img_url:require('@/assets/img/3.jpg'),
    		id:3,
    		title:'四狗子'
    	},
    ] 
     export default{
    	 data(){
    		 return {
    			 goods_list,
    			 goods_name:'未知',
    		 }
    	 },
    	 components:{
    		 Goods,Nav
    	 },
    	 methods:{
    		 chooseGoods(title){
    			 this.goods_name = title
    		 }
    	 }
     }
    </script>
    

    二、组件的生命周期钩子

    '''
    1.组件的生命周期是指:组件从创建前到销毁的整个过程。
    2.生命周期钩子:在一个组件的生命周期中,会出现很多特殊的节点,且往往会在特定的时间节点来完成一些必要的逻辑,特殊的事件节点可以绑定钩子。
    3.钩子:提前为某个事件绑定方法,当满足这个事件激活条件时,方法就会被调用,满足特定条件被回调的绑定方法就称为钩子。
    
    '''
    
    <template>
        <div class="goods">
            <Nav />
        </div>
    </template>
    <script>
        import Nav from "../components/Nav";
        export default {
            name: "Goods",
            components: {
                Nav,
            },
            beforeCreate() {
                console.log('该组件要被加载了')
            },
            created() {
                console.log('该组件要被加载成功了')
            },
            updated() {
                console.log('数据更新了')
            },
            destroyed() {
                console.log('该组件销毁了')
            }
        }
    </script>
    

    三、路由传参

    当我们搭建一个电商平台,用户点击某一个商品时,需要我们跳到商品的详情页,每个商品都有一个详情页,我们需要在跳转的同时传递商品的id,(得知用户点的是哪一个商品,从而向后台获取到数据)。

    1.通过正则匹配
    """
    路由传参:
    一、通过url正则传递数据
    i)设置
        路由: path: '/goods/detail/:pk'   |   '/goods/:pk/detail/:xyz'
        请求: '/goods/detail/任意字符'    |    '/goods/任意字符/detail/任意字符'
    ii)如何传
        <router-link :to="`/goods/detail/${pk}`"></router-link>
        this.$router.push(`/goods/detail/${pk}`)
    
    iii)如何取
        this.$route对象是管理路由参数的,传递的参数会在this.$route.params字典中
        this.$route.params.pk
    """
    

    (1)配置router/index.js

    {
        path: '/goodsdetail/:id',
        name: 'GoodsDetail',
        component: GoodsDetail
    }
    

    (2)传递

    Goods.vue

    <template>
    	<router-link :to="`/goodsdetail/${goods.id}`">
    		<div class="goods" style="text-align: center;" @click="clickGoods(goods.title,goods.id)" >
    			<img :src="goods.img_url" alt="">
    			<p>{{ goods.title }}</p>
    		</div>
    	</router-link>
    </template>
    
    --------------或者通过监听点击事件进行router跳转-----------
    
    
    <div class="goods" style="text-align: center;" @click="goto(goods.id)" >
        <img :src="goods.img_url" alt="">
        <p>{{ goods.title }}</p>
    </div>
    
    methods:{
        goto(id){
        this.$router.push(`/goodsdetail/${id}`)
        }
    }
    

    (3)在详情页进行接收goodsdetal.vue

    <script>
    	export default{
    		data(){
    			return {
    				id : '未知'
    			}
    		},
    		created() {
    			this.id = this.$route.params.id || this.$route.query.pk
    		}
    		
    	}
    </script>
    
    2.通过url传递
    '''
    二、通过url参数传递数据
    i)设置
        路由: path: '/goods/detail'
        请求: '/goods/detail?pk=数据'
    ii)如何传
        <router-link :to="`/goods/detail?pk=${pk}`"></router-link>
        <router-link :to="{name:'GoodsDetail', query:{pk: pk}}"></router-link>
    
        this.$router.push(`/goods/detail?pk=${pk}`)
        this.$router.push({name:'GoodsDetail', query:{pk: pk}})
    
    iii)如何取
        this.$route对象是管理路由参数的,传递的参数会在this.$route.query字典中
        this.$route.query.pk
    '''
    

    (1)配置router/index.js

    const routes = [
        {
            path: '/goods/detail',
            name: 'GoodsDetail',
            component: GoodsDetail
        },
    ]
    

    (2)传递Goods.vue

    <template>
    	<router-link :to="`/goodsdetail?id=${goods.id}`">
    		<div class="goods" style="text-align: center;">
    			<img :src="goods.img_url" alt="">
    			<p>{{ goods.title }}</p>
    		</div>
    	</router-link>
    </template>
    
    -------------------------或者逻辑跳转----------------------------
    <template>
    	<div class="goods" style="text-align: center;" @click="goto(goods.id)">
    		<img :src="goods.img_url" alt="">
    		<p>{{ goods.title }}</p>
    	</div>
    </template>
    
    
    goto(id){
        // this.$router.push(`/goodsdetail/${id}`)
        this.$router.push(`/goodsdetail?id=${id}`)
    }
    

    (3)接收使用query接收

    接收方式和正则匹配是一样的 query||params。

    四、全局配置

    global.css

    html, body {
        margin: 0;
    }
    a {
        color: black;
        text-decoration: none;
    }
    
    ul {
        margin: 0;
        padding: 0;
    }
    

    settings.js

    export default {
        base_url: 'https://127.0.0.1:8000'
    }
    

    main.js

    //1) 配置全局css
    import '@/assets/css/global.css'
    // import global_css from '@/assets/css/global.css'  // 资源需要用变量保存,方便以后使用
    // require('@/assets/css/global.css')
    // let global_css = require('@/assets/css/global.css')  // 资源需要用变量保存,方便以后使用
    
    
    // 2) 配置自定义js设置文件
    import settings from '@/assets/js/settings.js'
    Vue.prototype.$settings = settings;
    // 在任何一个组件中的逻辑,可以通过 this.$settings访问settings.js文件的{}数据
    

    五、小结

    '''
    项目:
    	环境:node-->npm-->cnpm--->vue/cli
    	创建项目:vue create vue
    	配置:配置npm启动项
    	项目目录结构:依赖、环境、入口、核心代码
    
    组件:
    	构成:template+script+style
    	导入:import 别名 from '路径'
    	父用子:1.导入 2.components中注册 3.使用
    	组件数据:组件化处理data(){return {} }
    	传参:父传子---自定义组件属性|子传父---自定义组件事件$emit
    	生命周期钩子:created  向后台请求数据
    	
    路由:
    	根组件的页面站位:<router-view />
    	导航栏中的页面跳转:<router-link to=''></router-link>
    	代码中的逻辑跳转:this.$router.push()|this.$router.go()
    	路由传参恶两种方式:url传参、正则匹配
    	两个路由对象:
    		this.$router -- 控制路由跳转
    		this.$route -- 控制路由数据
    '''
    
  • 相关阅读:
    npm的qs包的使用:stringify()将json对象序列化成表单数据
    git放弃本地某个文件或所有文件的修改
    git关联本地分支和远程分支, 在本地删除远程已经不存在的分支
    vs code代码提示的问题
    js BOM(二)offset系列,scroll系列,client系列,封装变速动画函数
    解决antd design的Modal组件弹出卡顿的问题
    js BOM(一)window、location、history、navigator、定时器setInterval,setTimeout,轮播图
    BizCharts渲染多条曲线时color的使用
    js DOM(三)节点、元素创建3种方式、为元素绑定多个事件addEventListener、attachEvent
    HDU 1081 To The Max
  • 原文地址:https://www.cnblogs.com/Ghostant/p/12316880.html
Copyright © 2020-2023  润新知