zoukankan      html  css  js  c++  java
  • vue框架:

    路飞项目
    1.vue框架:
        前台html+css+js框架,是不同于js与jq的数据框架
        指令| 实例成员| vue项目
        
    2.drf框架:
        django的插件,完成前后台分离项目后台接口编写的框架
        序列化组件| 三大认证组件|
        分页,筛选,过滤,排序|请求,解析,响应
        
    3.路飞项目:
        前台vue完成,后台由drf框架完成前后台分离项目
        git| 短信认证| celery异步任务| 项目上线
    -----------------------------------------------------------------------------------    
    js对象(字典)补充:
    let b = 20;
    let dic = {
        a:10,   //字典本身就是对象,key都是字符串形式可以省略引号
        b(b:b)        // 值为变量时,且与key同名,可以简写
        };
    console.log(dic)
    
    vue:    
        1.what是:用于构建用户界面的渐进式JavaScript框架(选择性控制)
        
        2.why.学: 
            1.是三大主流框架之一: Angular  React  Vue
            2.有先进的前端设计模式: MVVM
            3.可以完全脱离服务器端,以前端代码复用的方式渲染整个页面,组件化开发
            4.结合了其他框架的优点,轻量级,中文API,数据驱动,双向绑定,单页面应用
            5.虚拟DOM ***
             缺点:没其他两个框架完善,在趋于完善中
        3.vue环境: 本地导入,cdn导入
        
            注: 渐进式框架:根据需求,可以决定vue框架控制项目的具体方位,可以为一个标签,也可以为一个页面,甚至可以为一个项目
                new Vue({el:'.xxx'})
            
        4.挂载点:
            1.html页面:html与body不能作为挂载点,css3选择器语法
            2.一个vue对象挂载点之后只索引一个匹配结果,所以通常用id标识 
        
        实例成员:
            1.实例成员,data为vue环境提供数据,数据采用字典{}形式;
            2.fiters: 过滤器函数fn(a,b)-----> {{a | fn(b)}} | {{a,b | fn}}
            3.method:事件方法
            ------------------------------------
            computed: 设置 方法属性,该方法属性在页面渲染后,绑定的方法中任意变量发生改变(都被监听),都会回调绑定的方法,
                eg: 一个变量依赖多个变量
                
            
            watch: 设置已有属性的监听事件,监听的变量改变就会回调绑定的方法啊
                eg:多个变量依赖一个变量
                
            props:声明组件的自定义属性
            emit: 为组建自定义事件发送数据
                
            
        
        指令:
            文本: {{}}  | v-text | v-html
            事件: v-on:click="clickAction" | @click="clickAction" | @click="clickAction($event)"
            属性: v-bind:stylt="myStyle" | :class="[c1,c2]" | :class="{active: isActive}"
            表单指令: v-model="变量"
            -----------------------------
            v-once:
            v-cloak: 防止页面加载 抖动
            v-show: 绑定的页面为布尔类型,隐藏时,在页面中以 display:none 渲染
            v-if|v-else-if|v-else: 前分支成立会屏蔽后分支,else分支不需要条件
            v-for: 遍历
                字符串:  v-for="(ch,index) in str"
                数组:    v-for="(ele,index) in arr"
                对象:    v-for="(value,key,index) in obj"
            
    组件:
        1.定义:一个包含html,css,js独立的集合体,可以完成页面解析的代码复用
        2.组件分为根组件,全局组件,局部组件
            根组件:
            全局组件:
                vue.component("组件名",{实例成员萌})    
            局部组件:必须在使用该组件的父组件中注册
                let 组件名 = {实例抽根烟}
        3.组件都有自己template(根组件可以省略采用挂在点),
          子组件可以复用,所以数据要做局部化处理data(){ return{} }:
          在哪个组件模板中出现的变量,就由当前组件提供变量对应 的值
        
        4.组件信息交互
            父传子:提供绑定自定义属性
            子传父:提供自定义事件携带
            
            
            
            
    Vue 项目搭建:
        1.安装 node
            官网下载安装包,傻瓜式安装:https://nodejs.org/zh-cn/
        2.换源安装cnpm
            npm install -g cnpm --registry=https://registry.npm.taobao.org
        3.安装脚手架
            cnpm install -g @vue/cli
        4.如果2或3安装出错   清除缓存处理
            npm cache clean  --force
            
            
    Vue 项目创建:
        vue create 项目名;
        在pycharm中配置npm项目
        
    项目目录
    
    
    main.js:程序的入口文件
        加载vue环境
        加载插件环境: 路由,仓库,ajax,cookie,element-ui...
        加载自定义环境:全局样式(global.css),全局配置(settings.js)
        渲染根组件
    
    .vue文件形式组件
        template标签:内部有且只有一个跟标签
        script标签: export default{},导出该局部内容
        style标签: scope属性,实现样式的组件化
        
        
    项目运行生命周期:
        main.js => router.js => 链接 => 页面组件 =>替换根组件中的router-view 
        标签完成页面渲染 => 通过 router-link | this.$router.push()切换路由
        (链接) => 完成渲染组件的替换 => 页面的跳转
    
    
    新建页面的三步骤:
        1.创建页面组件
        2.设置组件路由
        3.设置路由跳转
        
        
    组件的生命周期钩子:组件从生成到销毁整个过程的一些特殊时间节点回调的函数
    
    this.$router:路由跳转
    this.$route:路由数据(this.$route.path)
    
    
    
    vue-router插件:****
    
    路由跳转:
        this.$router.push('/course');
        this.$router.puth({name:course});
        this.$router.go(-1);
        this.$router.go(1);
        <router-link :to="/course">课程页</router-link>
        <router-link :to='{name:'course'}">课程页</router-link>
        
        
    路由传参
    
        第一种:
            配置:path:'/path/:pk' =>请求: '/path/${pk} =>取值:this.$route.params.pk
        第二种:
            配置:path:'/path',name='path' =>请求:{name:'path',query={pk:值}} =>取值 this.$route.query.pk
            
        
    完成跨组件传参的方式:
        1. localStarage:            永久存储数据
        2. sessionStorage:          临时存储数据(刷新页面数据不重置)
        3. cookie:                  临时或永久数据(由过期时间决定)
        4. vuex的仓库(store.js):    临时存储数据(刷新页面数据重置)
        
    vuex仓库插件***
    
    store.js配置文件
        export default new Vuex.Store({
            state: {
                title: '默认值'
            },
            mutations: {
                // mutations 为 state 中的属性提供setter方法
                // setter方法名随意,但是参数列表固定两个:state, newValue
                setTitle(state, newValue) {
                    state.title = newValue;
                }
            },
            actions: {}
        })
            
    在任意组件中给仓库变量赋值
        this.$store.state.title = 'newTitle'
        this.$store.commit('setTitle','newTitle')
        
    在任意组件中取仓库变量的值
        console.log(this.$store.state.title)
        
        
    vue-cookie插件:***
        安装:
            >:cnpm install vue-cookies
        
        main.js配置:
            第一种:
            import cookies from 'vue-cookies'      // 导入插件
            Vue.use(cookies);                    // 加载插件
            new Vue({
                // ...
                cookies,                        // 配置使用插件原型 $cookies
            }).$mount('#app');
    
            第二种*****
            import cookies from 'vue-cookies'    // 导入插件
            Vue.prototype.$cookies = cookies;    // 直接配置插件原型 $cookies
                    
        使用:
            增(改): key,value,exp(过期时间)
                时间:  1s | 1m | 1h | 1y
                this.$cookies.set('token',token,'1y');
                
            查:key
                this.$cookies.get('token');
            
            删: key
                this.$cookies.remove('token')
                
        注: cookie一般是用来存储token的
            1.token: 安全认证的随机字符串
            2.有后台产生,存储于后台的(session表中,文件,内存缓存),存储于前台的(cookie中)
            3.服务器先生成反馈给前台(登录认证过程),
              前台提交给后台完成认证(需要登录后的请求)
             
            4.前后台分离项目:后台生成token,返回给前台 ==>前台自己存储,
              发送携带token请求 ==> 后台完成token校验 ==>后台得到登录用户
              
              
    axios插件:****
        安装:   
            cnmp install axios
        main.js配置:
            import axios from 'axios' //导入插件
            Vue.prototype.$axios = axios; 直接配置插件原型 
        使用:
            this.axios({
                url:'请求接口',
                method:'get|post',
                data:{post提交的数据},
                params:{get提交的数据},
                header:{请求头}    
                }).then(function(response){
                    请求成功的回调函数}).catch(function(error){
                    请求失败的回调函数})
        
        案例:
            // get请求
            this.$axios({
                url: 'http://127.0.0.1:8000/test/ajax/',
                method: 'get',
                params: {
                    username: this.username
                }
            }).then(function (response) {
                console.log(response)
            }).catch(function (error) {
                console.log(error)
            });
    
            // post请求
            this.$axios({
                url: 'http://127.0.0.1:8000/test/ajax/',
                method: 'post',
                data: {
                    username: this.username
                }
            }).then(function (response) {
                console.log(response)
            }).catch(function (error) {
                console.log(error)
            });
            
    跨越问题(同源策略):
        后台接收到前台的请求,可以接收前台数据与请求信息,发现请求的信息不是自身服务器发来的请求,拒绝响应数据,这种情况称之为 - 跨域问题(同源策略 CORS)
    
        导致跨域情况有三种
         1) 端口不一致
         2) IP不一致
         3) 协议不一致
    
        Django如何解决 - django-cors-headers模块
         1) 安装:pip3 install django-cors-headers
         2) 注册:
        INSTALLED_APPS = [
            ...
            'corsheaders'
        ]
         3) 设置中间件:
        MIDDLEWARE = [
            ...
            'corsheaders.middleware.CorsMiddleware'
        ]
         4) 设置跨域:
        CORS_ORIGIN_ALLOW_ALL = True
    
    
    element-ui插件:
        下载=>配置=>使用
        下载:
            cnpm install element-ui
            
        配置main.js:
            import ElementUI from 'element-ui'
            import 'element-ui/lib/theme-chalk/index.css';
            Vue.use(ElementUI);
        
        使用:
            依照官网 https://element.eleme.cn/#/zh-CN/component/installation api
    View Code

     组件间的交互

    父传子:
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            .info {
                text-align: center;
                width: 200px;
                padding: 3px;
                box-shadow: 0 3px 5px 0 pink;
                float: left;
                margin: 5px;
            }
            .info img {
                width: 200px;
            }
        </style>
    </head>
    <body>
        <div id="app">
            <info v-for="info in infos" :key="info.image" :myinfo="info"></info>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script> 
        // 伪代码:模拟数据从后台请求
        /*
        let infos = '';
        document.onload = function () {
            $.ajax({
                url: '/images/',
                type: 'get',
                success (response) {
                    infos = response.data
                }
            })
        };
         */
    
        let infos = [
            {
                image: 'img/001.png',
                title: '小猫'
            },
            {
                image: 'img/002.png',
                title: '蛋糕'
            },
            {
                image: 'img/003.png',
                title: '蓝糕'
            },
            {
                image: 'img/004.png',
                title: '恶犬'
            },
        ];
    
        let info = {
            template: `
            <div class="info">
                <img :src="myinfo.image" alt="">
                <p><b>{{ myinfo.title }}</b></p>
            </div>
            `,
            props: ['myinfo']
        };
    
        // 数据交互 - 父传子 - 通过绑定属性的方式
        // 1) 父组件提供数据
        // 2) 在父组件模板中,为子组件标签设置自定义属性,绑定的值有父组件提供
        // 3) 在子组件实例中,通过props实例成员获得自定义属性
        new Vue({
            el: '#app',
            components: {
                info,
            },
            data: {
                infos,
            }
        })
    </script>
    子传父:
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            .close:hover {
                cursor: wait;
                color: red;
            }
        </style>
    </head>
    <body>
        <div id="app">
            <p>
                <input type="text" v-model="userMsg">
                <button @click="sendMsg">留言</button>
            </p>
            <ul>
                <msg-li @remove_msg="removeAction" v-for="(msg, i) in msgs" :msg="msg" :index="i" :key="msg"></msg-li>
            </ul>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        let msgLi = {
            template: `
            <li>
                <span class="close" @click="deleteMsg(index)">x </span>
                <span>第{{ index + 1 }}条:</span>
                <span>{{ msg }}</span>
            </li>
            `,
            props: ['msg', 'index'],
            methods: {
                // 系统的click事件
                deleteMsg(i) {
                    // $emit('自定义事件名', 参数们)
                    this.$emit('remove_msg', i);
                    this.$emit('myclick', 1, 2, 3, 4, 5)
                }
            }
        };
        // 组件交互-子传父
        // 1) 数据由子组件提供
        // 2) 子组件内部通过触发系统事件,发送一个自定义事件,将数据携带出来
        // 3) 父组件位子组件标签的自定义属性通过方法实现,就可以通过参数拿到子组件传递处理的参数
    
        new Vue({
            el: '#app',
            data: {
                msgs: [],
                userMsg: ''
            },
            methods: {
                sendMsg() {
                    if (this.userMsg) {
                        this.msgs.push(this.userMsg);
                        this.userMsg = "";
                    }
                },
                removeAction(i) {
                    this.msgs.splice(i, 1)
                }
            },
            components: {
                msgLi
            }
        })
    </script>
  • 相关阅读:
    python 闭包
    并行【parallel】和并发【concurrency】线程是并发还是并行,进程是并发还是并行
    生成器,送代器的区别
    深拷贝和浅拷贝的区别
    对缺省参数的理解
    对不定长参数的理解
    mysql三范式
    mysql基础查询语法
    mysql常见查询练习题
    Ubantu-Nginx部署
  • 原文地址:https://www.cnblogs.com/wyf20190411-/p/11681452.html
Copyright © 2011-2022 走看看