zoukankan      html  css  js  c++  java
  • Vue组件信息传递和Vue项目开发

    一.全局组件

    <body>
        <!-- 两个全局vue实例可以不用注册全局组件,就可以使用 -->
        <div id="app">
            <global-tag></global-tag>
        </div>
        <div id="main">
            <global-tag></global-tag>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        // 创建全局组件 组件名 {}
        Vue.component('global-tag', {
            template: "<div @click='fn'>全局组件点击了 {{ count }} 次</div>",
            data: function () {
                return {
                    count: 0
                }
            },
            methods: {
                fn: function () {
                    this.count++;
                }
            }
        });
        // 两个挂载点
        new Vue({
            el: "#app",
        });
        new Vue({
            el: "#main",
        });
    </script>

    二.父组件传递信息给子组件

    '''
    采用属性绑定的方式
    1,父级提供数据
    2.绑定给子组件的自定义属性
    3.子组件通过props的数组拿到自定义属性从而拿到数据
    '''

    <body>
        <div id="app">
            <input type="text" v-model="sup_data">
            <!-- 2 -->
            <global-tag :abcde="sup_msg" :sup_data="sup_data"></global-tag>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        // 创建全局组件
        Vue.component('global-tag', {
            // 3
            props: ['abcde', 'sup_data'],
            template: "<div @click='fn'>{{ abcde }}</div>",
               methods: {
                fn: function () {
                    alert(this.sup_data)
                }
            }
        });
        // 将父组件的信息传递给子组件
        // 采用属性绑定的方式: 1,父级提供数据 2.绑定给子组件的自定义属性 3.子组件通过props的数组拿到自定义属性从而拿到数据
        new Vue({
            el: "#app",
            data: {
                // 1
                sup_msg: "父级的msg",
                sup_data: ""
            }
        });
    </script>

    三.子组件传递信息给父组件

    '''
    采用发生事件的方式:
    1.在子组件的内容系统事件中来定义一个自定义事件,采用$emit发生到自定义组件名上(可以携带子组件内容数据)
    2.在父组件复用子组件时, 实现子组件自定义数据的功能, 在父组件中的methods中为功能绑定函数(函数的参数就是携带出来的数据)
    3.当在组件内部激活系统事件,就会激活自定义事件,$emit发生给父级,激活父级绑定的函数,该函数被执行,同时拿到数据
    '''

    <body>
        <div id="app">
            <!-- abc为子组件的自定义事件,该事件的含义要在子组件内容声明规定 -->
            <!-- 2 -->
            <global-tag @abc="action"></global-tag>
            <global-tag @abc="action"></global-tag>
            {{ sup_info }}
        </div>
    
    </body>
    <script src="js/vue.js"></script>
    <script>
        // 创建全局组件
        Vue.component('global-tag', {
            template: "<div><input v-model='info'><p @click='sendMsg'>子组件</p></div>",
            data: function () {
                return {
                    info: "",
                    msg: "子组件的信息"
                }
            },
            methods: {
                // 1
                sendMsg: function () {
    //                alert(123)
                    // 激活自定义事件 abc
                    this.$emit('abc', this.msg, this.info)
                },
    
            }
        });
        // 将子组件的信息传递给父组件
        // 采用发生事件的方式:
        // 1.在子组件的内容系统事件中来定义一个自定义事件,采用$emit发生到自定义组件名上(可以携带子组件内容数据)
        // 2.在父组件复用子组件时, 实现子组件自定义数据的功能, 在父组件中的methods中为功能绑定函数(函数的参数就是携带出来的数据)
        // 3.当在组件内部激活系统事件,就会激活自定义事件,$emit发生给父级,激活父级绑定的函数,该函数被执行,同时拿到数据
        new Vue({
            el: "#app",
            data: {
                sup_info: ""
            },
            methods: {
                // 3
                action: function (msg, info) {
                    alert(msg)
                    this.sup_info = info
                }
            }
        });
    </script>

    四.Vue项目开发

    '''
    一个.vue文件就是一个组件
    一个个小组件(存放在conponents文件夹下)组成一个可以代表页面的大组件(存放在views文件夹下)
    每一个组件(.vue文件)都由 <template><template> <script></script> <style></style>

    要打开一个已有的项目并运行,不需要项目的node_modules文件夹,今日项目目录执行npm install会自动安装项目的依赖包
    '''

    #### 1、环境搭建
    
    - 安装node
    
    ```
    官网下载安装包,傻瓜式安装:https://nodejs.org/zh-cn/
    ```
    
    - 安装cnpm
    
    ```
    npm install -g cnpm --registry=https://registry.npm.taobao.org
    ```
    
    - 安装脚手架
    
    ```
    cnpm install -g @vue/cli
    ```
    
    - 清空缓存处理
    
    ```
    npm cache clean --force
    ```
    

    2

    #### 2、项目的创建
    
    - 创建项目
    
    ```js
    vue creat 项目名
    // 要提前进入目标目录(项目应该创建在哪个目录下)
    // 选择自定义方式创建项目,选取Router, Vuex插件
    ```
    
    - 启动/停止项目
    
    ```js
    npm run serve / ctrl+c
    // 要提前进入项目根目录
    ```
    
    - 打包项目
    
    ```js
    npm run build
    // 要在项目根目录下进行打包操作
    ```
    

    3认识项目

    (1)项目目录

    dist: 打包的项目目录(打包后会生成)
    node_modules: 项目依赖
    public: 共用资源
    src: 项目目标,书写代码的地方
        -- assets:资源
        -- components:组件
        -- views:视图组件
        -- App.vue:根组件
        -- main.js: 入口js
        -- router.js: 路由文件
        -- store.js: 状态库文件
    vue.config.js: 项目配置文件(没有可以自己新建)

    (2)配置文件:vue.config.js

    module.exports={
        devServer: {
            port: 8888
        }
    }
    // 修改端口,选做

    (3)main.js

    new Vue({
        el: "#app",
        router: router,
        store: store,
        render: function (h) {
            return h(App)
        }
    })

    (4)vue文件

    <template>
        <!-- 模板区域 -->
    </template>
    <script>
        // 逻辑代码区域
        // 该语法和script绑定出现
        export default {
            
        }
    </script>
    <style scoped>
        /* 样式区域 */
        /* scoped表示这里的样式只适用于组件内部, scoped与style绑定出现 */
    </style>

    4.项目功能

    (1)vue-router

    {
        path: '/',
        name: 'home',
        // 路由的重定向
        redirect: '/home'
    }
    
    {
        // 一级路由, 在根组件中被渲染, 替换根组件的<router-view/>标签
        path: '/one-view',
        name: 'one',
        component: () => import('./views/OneView.vue')
    }
    
    {
        // 多级路由, 在根组件中被渲染, 替换根组件的<router-view/>标签
        path: '/one-view/one-detail',
        component: () => import('./views/OneDetail.vue'),
        // 子路由, 在所属路由指向的组件中被渲染, 替换该组件(OneDetail)的<router-view/>标签
        children: [{
            path: 'show',
            component: () => import('./components/OneShow.vue')
        }]
    }
    <!-- router-link渲染为a标签 -->
    <router-link to="/">Home</router-link> |
    <router-link to="/about">About</router-link> |
    <router-link :to="{name: 'one'}">One</router-link> |
    
    <!-- 为路由渲染的组件占位 -->
    <router-view />
    a.router-link-exact-active {    color: #42b983;}
    // router的逻辑转跳
    this.$router.push('/one-view')
    // router采用history方式访问上一级
    this.$router.go(-1)

    (2)vuex

    // 在任何一个组件中,均可以通过this.$store.state.msg访问msg的数据
    // state永远只能拥有一种状态值
    state: {
        msg: "状态管理器"
    },
    // 让state拥有多个状态值
    mutations: {
        // 在一个一个组件中,均可以通过this.$store.commit('setMsg', new_msg)来修改state中的msg
        setMsg(state, new_msg) {
            state.msg = new_msg
        }
    },
    // 让mutations拥有多个状态值
    actions: {
    
    }

    (2)vue-cookie

    // 安装cookie的命令
    // npm install vue-cookie --save
    // 为项目配置全局vue-cookie
    import VueCookie from 'vue-cookie'
    // 将插件设置给Vue原型,作为全局的属性,在任何地方都可以通过this.$cookie进行访问
    Vue.prototype.$cookie = VueCookie
    // 持久化存储val的值到cookie中
    this.$cookie.set('val', this.val)
    // 获取cookie中val字段值
    this.$cookie.get('val')

    (2)axios

    // 安装 axios(ajax)的命令
    // npm install axios--save
    // 为项目配置全局axios
    import Axios from 'axios'
    Vue.prototype.$ajax = Axios
    let _this = this
    this.$ajax({
        method: 'post',
        url: 'http://127.0.0.1:5000/loginAction',
        params: {
            usr: this.usr,
            ps: this.ps
        }
    }).then(function(res) {
        // this代表的是回调then这个方法的调用者(axios插件),也就是发生了this的重指向
        // 要更新页面的title变量,title属于vue实例
        // res为回调的对象,该对象的data属性就是后台返回的数据
        _this.title = res.data
    }).catch(function(err) {
        window.console.log(err)
    })
    # 用pycharm启动该文件模拟后台
    from flask import Flask, request, render_template
    from flask_cors import CORS
    app = Flask(__name__)
    CORS(app, supports_credentials=True)
    
    @app.route('/')
    def index():
        return "<h1>主页</h1>"
    
    @app.route('/loginAction', methods=['GET', 'POST'])
    def test_action():
        # print(request.args)
        # print(request.form)
        # print(request.values)
        usr = request.args['usr']
        ps = request.args['ps']
        if usr != 'abc' or ps != '123':
            return 'login failed'
        return 'login success'
    
    
    if __name__ == '__main__':
        app.run()
  • 相关阅读:
    超好用的Redis管理及监控工具,使用后可大大提高你的工作效率!
    MySQL,Oracle,PostgreSQL,DB2,mongoDB,Hive, SAP HANA 数据库web维护客户端管理工具
    DB2定时循环同步数据到MySQL
    SQL Server数据同步到MySQL
    powerDesign导出word操作步骤
    数据库工单的主要业务流程
    Redshift数据库客户端工具的使用
    如何提高数据库管理质量?
    远程管理mysql数据库
    SQL工单管理
  • 原文地址:https://www.cnblogs.com/ye-hui/p/10398026.html
Copyright © 2011-2022 走看看