• Python 28 Vue框架


    一、基本使用

    <div id="odiv">{{ greeting }}</div>
    
    <script src="./static/vue.min.js"></script>
    <script>
        let vm = new Vue({
            el: "#odiv",
            data: {
                greeting: "hello world",
            }
        })
    </script>

    二、常用指令

    1、v-text、v-html

    <div id="odiv" v-text="greeting"></div>
    <div id="odiv" v-html="greeting"></div>
    greeting: "<h1>hello world</h1>"

    2、v-for:循环创建标签

    <div id="odiv" v-for="num in yin">{{ num }}</div>
    <div id="odiv" v-for="student in students">{{ student.name }}</div>
    
    yin: [1, 2, 3]
    students: [{name: "yin"}, {name: "wen"}, {name: "jie"}]

    3、v-if、v-show

    v-if是先append多个标签,如果不符合条件再remove,这样来回切换的效率较低。

    v-show是给不符合条件的标签加上display=none,效率更高一些。

    <div v-if="word == 'xxx'">有</div>
    <div v-else-if="word == 'xx'">还是</div>
    <div v-else>没有</div>
    <div v-show="isShow">你好</div>

    4、v-bind:绑定属性

    <div v-bind:href="path">点击</div>
    <div v-bind:class="{active:isActive}">有</div>
    <div v-bind:class="[attr]">有</div>
    
    isActive:true,
    attr: "active"

    5、v-on:绑定事件

    <div v-on:click="change">点击</div>  // 可以简写成@click

    methods:{
    change:function(){xxx}
    }

    6、v-model:获取用户输入

        <div id="app">
            <input type="text" v-model="name"/>
    
            <input type="checkbox" value="男" v-model="genders"/>
            <input type="checkbox" value="女" v-model="genders"/>
    
            <select v-model="girlfriends">
                <option>康抻</option>
                <option>鞠莹莹</option>
                <option>嘉琪</option>
            </select>
    
            <textarea></textarea>
    
            <hr>
            {{ name }}
            {{ genders }}
            {{ girlfriends }}
        </div>
    
        <script>
            // 数据模板引擎
            // v-开头的指令是帮助我们渲染数据用的
            let vm = new Vue({
                el: "#app",
                data: {
                    name: "juyingying",
                    genders: [],
                    girlfriends: []
                },
            })
        </script>
    View Code

    7、计算属性:对数据进行加工操作

    <input v-model="a">
    <input v-model="b">
    <input v-model="c">
    <div>{{ total }}</div>
    
    data:{a:1,b:2,c:3},
    computed:{
        total: function(){
           return this.a + this.b + this.c
       }
    }

    8、侦听器:当数据发生改变时触发

      data: {
        question: '',
        answer: 'I cannot give you an answer until you ask a question!'
      },
      watch: {
        // 如果 `question` 发生改变,这个函数就会运行
        question: function (newQuestion, oldQuestion) {
          this.answer = 'Waiting for you to stop typing...'
          this.debouncedGetAnswer()
        }
      },

    9、指令修饰符:对用户输入的数据加工

    v-model.number="xx"  // 将输入的数据改为数值类型
    v-model.trim="xx"  // 将输入的数据两端的空白去除
    v-model.lazy="xx"  // 在失去焦点时才更新数据

    10、获取DOM元素

    <div id="app">
        <div ref="t" v-text="greeting"></div>
        <button v-on:click="changeColor">点击变红</button>
    </div>
    
    <script src="./static/vue.min.js"></script>
    <script>
        new Vue({
            el: "#app",
            data: {
                greeting: "hello world",
            },
            methods:{
                changeColor:function(){
                    this.$refs.t.style.color = "red";
                }
            }
        })
    </script>

    11、自定义指令

    Vue.directive("pos", function(el, bindding){  // 第一个参数是指令名称,第二个参数是一个函数,其中参数1是绑定的标签,参数2是传入的数据
        if (bindding.value=true){
            el.style.position = "fixed";
            el.style.right = 0;
            el.style.bottom = 0;
        }
    })

    三、组件

    1、全局组件和局部组件

    全局组件就是定义之后不用在Vue对象中注册,可以并且只可以在html中使用的。局部组件必须在父组件中注册,但是可以在任意的组件中使用。

    <div id="app"><Box></Box></div>
    
    <script>
        Vue.component("Box",{
            template: `<button v-on:click="times++">你点击了{{ times }}次</button>`,
            data(){
                return {
                    times: 0,
                }
            }
        });
    
        new Vue({
            el: "#app",
        })
    全局组件
    <div id="app"><Box></Box></div>
    
    <script>
        let Box = {
            template:`<button v-on:click="times++">你点击了{{ times }}次</button>`,
            data(){
                return {
                    times: 0,
                }
            }
        };
    
        new Vue({
            el: "#app",
            components:{
                Box:Box,
            }
        })
    局部组件

     2、父子组件通信

    // 子组件
    let son = {
        template: `
            <div>{{ fdata }}</div>
        `,
        props: ["fdata", ]
    }
    
    // 父组件
    let father = {
        template: `
            <son fdata=_fData_><son>
            <div></div>
        `,
        data(){
            return {
                fData: 0
            }
        },
        components:{
            son: son,
        }
    }
    父向子传值

    如果在子组件中想要监听这个值的变化可以使用侦听器

    <div id="app"><father></father></div>
    
    <script>
        let son = {
            template:`<button v-on:click="sonClick">点击变大</button>`,
            methods:{
                sonClick(){
                    this.$emit("sonClick", 1)
                }
            }
        };
    
        let father = {
            template: `
                <div>
                    <div v-bind:style="{ fontSize:size + 'px' }">字体大小</div>
                    <son v-on:sonClick="changeSize"></son>
                </div>
            `,
            data(){
                return {
                    size: 10
                }
            },
            components:{
                son: son,
            },
            methods:{
                changeSize(num){
                    console.log(num);
                    this.size += num;
                    console.log(this.size)
                }
            }
        };
    
        new Vue({
            el: "#app",
            components:{
                father: father
            }
        })
    子修改父值

    3、插槽:用于组件复用

    <body>
        <div id="app">
            <global-component>首页</global-component>
            <global-component>免费课程</global-component>
            <global-component>轻课</global-component>
            <global-component>智能题库</global-component>
            <global-component>学位课程</global-component>
        </div>
    <script>
        Vue.component("global-component", {
            template: `
                <div class="box"><slot></slot></div>
            `
        });
    
        new Vue({
            el: "#app",
        })
    </script>
    插槽

    四、生命周期

    1、beforeCreate:在Vue实例被创建之前,此时页面已加载完成,但是还没有Vue实例。

    2、created:在Vue实例创建之后,此时Vue实例已经创建,数据、函数等已经创建完成,但是还没有渲染页面,没有el。

    3、beforeMount:在挂载之前,此时已经找到了要渲染的标签,el中已经有了这个标签,但是还没有加载数据。

    4、mounted:在挂载之后,此时页面已被渲染完毕。

    5、beforeUpdate:在状态更新之前,data中的数据已被更新,但页面中的数据还没更新。

    6、updated:在状态更新之后,data和页面中的数据都已更新。

    7、beforeDestroy、destroyed

    8、activated、deactivated:用<keep-alive></keep-alive>标签将某个组件包裹起来,这样这个组件的切换就只是隐藏和显示,不再是直接remove,保证了切换效率,但是同时让上面的八种声明周期方法都失效,只能使用activated和deactivated。

    五、VueRouter

    1、基本使用

    <div id="app">
        <!-- router-link会被渲染成a标签,to会被渲染成href -->
        <router-link to="/">首页</router-link>
        <router-link to="/login">登陆</router-link>
        <!-- 显示组件 -->
        <router-view></router-view>
    </div>
    
    <script src="./static/vue.min.js"></script>
    <script src="./static/vue-router.js"></script>
    <script>
        // 1、使用VueRouter
        Vue.use(VueRouter);
    
        // 2、定义路由组件
        let home = {
            template: `<div>这是首页</div>`
        };
    
        let login = {
            template: `<div>这是登陆页面</div>`
        };
    
        // 3、定义路由关系
        routes = [
            {path: "/", component: home},
            {path: "/login", component: login}
        ];
    
        // 4、实例化一个router对象
        let router = new VueRouter({
            routes: routes
        });
    
        // 5、将router和Vue挂载
        new Vue({
            el: "#app",
            router: router
        })
    
    </script>
    基本使用

    在其他地方想点击跳转,可以:

    this.$router.push({name: "xx", params: {xx: "xx"}})

    2、路由命名

    <router-link :to="{ name:'home' }">首页</router-link>
    <router-link :to="{ name:'login' }">登陆</router-link>
    routes = [
        {path: "/", component: home, name: "home"},
        {path: "/login", component: login, name: "login"}
    ];

    3、路由传参

    用 :id表示需要传递params,构成路由的一部分

    什么都不加表示需要传递query,构成?xx=xx的数据

        let userParams = {
            template: `<div>这是用户{{ $route.params.id }}</div>`
        };
    
        let userQuery = {
            template: `<div>这是用户{{ $route.query.id }}</div>`,
        };
    
        routes = [
            {path: "/user/:id", component: userParams, name: "userParams"},
            {path: "/user/", component: userQuery, name: "userQuery"}
        ];
    JS
    <div id="app">
        <router-link :to="{ name:'userParams', params: {id: '1'} }">用户</router-link>
        <router-link :to="{ name:'userQuery', query:{id:1} }">用户</router-link>
        <!-- 显示组件 -->
        <router-view></router-view>
    </div>
    html

    4、路由重定向

    routes: [
        { path:"/a", redirect:"/b" },
        { path:"/a", redirect:{name: 'b'} }
    ]

    5、路由嵌套

    6、路由钩子函数

    const router = new VueRouter({ ... })
    router.beforeEach((to, from, next) => {
      // ...
    })

    7、路由去掉井号

    let router = new VueRouter({
         mode: 'history',
    )}

    六、Node、spm、webpack

    1、Node.js

    Node.js就是JavaScript的运行环境,可以让js语言在没有浏览器的情况下直接在终端运行,变成像python一样的脚本语言。

    2、npm

    npm是JS的第三方库管理工具,安装Node.js后就默认安装了npm。

    npm安装包分为全局安装和局部安装,全局安装:npm install -g vue,局部安装:npm install vue --save

    # 初始化项目目录
    npm init -y
    
    # 下载包
    npm install -g xxxx
    npm install xxx --save
    
    # 卸载
    npm uninstall xxx
    
    # 更新
    npm update xxx

    3、webpack

    七、vue-cli

    vue-cli是帮我们快速搭建项目的脚手架工具

    # 1、全局安装vue-cli
    npm install -g @vue/cli  # 3版本安装方式
    
    # 2、在文件夹中创建项目
    npm init -y
    vue init webpack vue-demo
    
    # 3、切换到项目目录中,启动项目
    cd vue-demo
    npm run dev

    项目结构和使用:

    八、Vuex

    用来进行状态管理,提供一个公共的部分存放数据,各个组件都能访问。

    import Vue from "vue"
    import Vuex from "vuex"
    
    Vue.use(Vuex);
    
    export default new Vuex.Store({
       // 用来共享数据,this.$store.state.name
       state:{
           name: "yin"
       },
       // 对数据加工,this.$store.getters.new_name
       getters:{
           new_name: function(state){
              return state.name + "1"
           }
       },
      // 对数据修改, this.$store.commit("change_name", "xxx")
       mutations:{
           "change_name": function(state, data){
               state.name = data
           }
       },
    })
    store.js
    import Vue from 'vue'
    import App from './App'
    import router from './router'
    import store from './store'
    
    Vue.config.productionTip = false
    
    /* eslint-disable no-new */
    new Vue({
      el: '#app',
      router,
      store,
      components: { App },
      template: '<App/>'
    });
    main.js

    九、axios

    // 以后可以在组件中通过$axios来使用
    import axios from 'axios'
    Vue.prototype.$axios = axios
      mounted(){
    let that = this
    this.$axios.request({ url: "xxx", method: "get" }).then(function(data){ // 成功的回调 }).catch(function(data){ // 失败的回调 }) }

    十、打包发布

    1、修改打包后寻找静态文件的路径

    因为打包后产生的dist文件夹里面有一个index.html,一个static文件包,如果要找静态资源需要相对路径。

     注意:这里是在build{ }下修改而不是开头的那个

    2、执行打包命令

    npm run build

    3、将生成的dist部署到nginx

  • 相关阅读:
    Git Bash主题配置
    vuex里mapState,mapGetters使用详解
    Vue基础汇总实践
    Chrome for Mac键盘快捷键!来自Google Chrome官网!
    Vue中ESlint配置文件.eslintrc文件
    axios的get,post方法
    正则表达式识别标记——包括它之间的标记
    关于如何在微信里面让video不全屏播放
    javascript执行机制
    防止表单多次提交方法之二
  • 原文地址:https://www.cnblogs.com/yinwenjie/p/11282141.html
Copyright © 2020-2023  润新知