美文网首页
Vue 渐进式框架

Vue 渐进式框架

作者: 潜心之力 | 来源:发表于2020-02-15 23:42 被阅读0次

    一、起步

    Vue框架的核心思想是MVVM(Model-View-View-Model),实现了视图和数据的双向绑定,即改变视图会触发数据的改变,同样改变数据会触发视图的改变。

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <title>Vue</title>
    </head>
    
    <body id="app">
      {{ message }}
    </body>
    
    <script src="/resources/js/vue.js" type="text/javascript"></script>
    <script type="text/javascript">
      let app = new Vue({ -> 创建Vue对象
        el: '#app', -> 定义Vue的作用域
        data: { -> 定义双向绑定的属性
          message: 'Hello Vue!'
        }
      });
    </script>
    
    this.data = JSON.parse(JSON.stringify(this.data)); -> 刷新双向绑定
    

    二、标签语法

    • v-bind:attribute,动态绑定标签原有的属性
    <span v-bind:title="message"></span>
    <span :title="message"></span> -> 缩写
    
    对象语法,value为true时写入
    <div class="div" v-bind:class="{active:true}"></div> -> class="div active"
    数组语法,所有属性都写入
    <div v-bind:class="['div',‘active’]"></div> -> class="div active"
    
    内联样式
    <div v-bind:style="{color:'red',fontSize:'20px'}"></div> -> style="color:red;fontSize:20px"
    <div v-bind:style="[{color:'red'},{fontSize:'20px'}]"></div> -> style="color:red;fontSize:20px"
    
    • v-if、v-else-if、v-else,动态生成满足条件的标签
    <span v-if="false">if条件成立</span> -> 不生成span标签
    <span v-else-if="false">else-if条件成立</span> -> 不生成span标签
    <span v-else>else条件成立</span> -> 生成span标签
    
    • v-show,满足条件时显示元素,不满足时隐藏
    <span v-show> {{ message }} </span>
    
    • v-for,循环生成标签和数据渲染
    <ul>
      <li v-for="item in array"> {{ item.name }} </li>
    </ul>
    
    <script type="text/javascript">
      let app = new Vue({
        el: '#app',
        data: {
          array: [{"name":"w"},{"name":"j"},{"name":"x"}]
        }
      });
    </script>
    
    • v-model,表单元素的内容双向绑定
    <input v-model="input">
    <textarea v-model="textarea"></textarea>
    
    .lazy -> 输入内容在change事件后同步
    .number -> 输入内容自动转数值类型
    .trim -> 输入内容首尾空格字符清除
    语法: v-model.lazy v-model.number v-model.trim 
    
    <script type="text/javascript">
      let app = new Vue({
        el: '#app',
        data: {
          input:'this is input',
          textarea:'this is textarea'
        }
      });
    
    • v-once,只执行一次赋值,属性发生改变时也不会刷新到UI
    <span v-once> {{ message }} </span>
    
    • v-html,输出html片段,不进行转义
    <div v-html="<span>html</span>"></div>
    
    • v-text,对字符串转义输出文本
    <span v-text="message"></span>
    

    三、事件语法

    • v-on:event,监听事件作出响应
    <button v-on:click="reverse"> {{ message }} </button>
    <button @click="reverse"> {{ message }} </button> -> 缩写
    <button @click.prevent="reverse"> {{ message }} </button> -> 阻止冒泡
    
    let app = new Vue({
      el: '#app',
      data: {
        message : 'wjx'
      },
      methods: { -> 定义方法
        reverse: function () {
          this.message =this.message.reverse(); -> 反转字符并回显
        }
      }
    })
    

    四、计算和侦听

    <span> {{reversedMessage}} </span>
    
    var app = new Vue({
      el: '#app',
      data: {
        message: 'Hello'
      },
      computed: { -> 属性值发生改变时触发计算并将结果放入缓存,反之从缓存中读取值
        reversedMessage: function () {
          return this.message.split('').reverse().join('');
        }
      },
      watch: { -> 属性值发生改变时触发方法,适合处理开销大的操作(网络请求)
        message: function (newValue, oldValue) { -> 侦听属性名
          $.ajax({}); -> 模拟网络请求获取数据
        }
      }
    });
    

    五、自定义组件

    Vue规定每个组件必须只有一个根元素

    Vue.component('blog-post', { -> 组件名称
      props: ['post'], -> 属性入参名
      template: `
        <div class="blog-post">
          <h3>{{ post.title }}</h3>
          <div v-html="post.content"></div>
        </div>
        <button v-on:click="$emit('button-event')"> -> 向父组件传递名为button-event的事件
          Button Event
        </button>
      `
    });
    
    <blog-post -> 使用方式
      v-bind:key="post.id"
      v-bind:post="post"
      v-on:button-event="buttonEvent" -> 父组件接收子组件触发名为button-event的事件
    ></blog-post>
    
    <template> -> 自定义组件(wjx-slot.vue)
        <view>
            <view> -> 每个模板(*.vue)都有自身的作用域,数据只在本作用域调取
                <slot name="header" v-bind:header="header">{{header}}</slot>
            </view>
            <view>
                <slot>{{content}}</slot> -> name="default"
            </view>
            <view> -> 将子作用域的数据通过v-bind指令传递给父作用域
                <slot name="footer" v-bind:footer="footer">{{footer}}</slot>
            </view>
        </view>
    </template>
    
    <script>
        export default {
            data() {
                return {
                    header: "header",
                    content: "content",
                    footer: "footer"
                }
            },
            mounted() {
                console.log(this.$slots);
                console.log(this.$scopedSlots);
            }
        }
    </script>
    
    <template>
        <view>
            <wjx-slot> -> 使用组件
                <view slot="header" slot-scope="params">I'm new header</view>
                <view slot="default">I'm new content</view>
                <view slot="footer" slot-scope="params">I'm new footer</view>
            </wjx-slot>
    
            <wjx-slot> -> v-slot指令只能添加在<template>上
                <template v-slot:header="params">{{params.header}}</template>
                <template v-slot:default>I'm new content</template>
                <template v-slot:footer="params">{{params.footer}}</template>
            </wjx-slot>
        </view>
    </template>
    
    <script>
        import wjxSlot from '@/pages/component/slot.vue'; -> 引入组件
        export default {
            components:{
                wjxSlot -> 声明组件
            }
        }
    </script>
    

    六、UniApp多平台发行

    • 基础配置
    应用名称(APP应用名称)
      WJX
    应用描述(应用的[版本信息]功能)
      一款超级豪华的移动应用
    应用版本名称(应用的[版本信息]功能)
      1.0.0
    应用版本号(必须是整数,升级时必须高于上一次设置的值)
      100
    
    • H5配置(HBuilderX)
    页面标题(默认为应用名称)
      客户资源管理系统
    index.html模板路径(默认为空,可定制生成的html代码,自定义meta、引入外部js)
      template.h5.html
    路由模式(hash[请求路径带特殊符号]、history[页面不支持刷新])
      hash
    运行的基础路径(例:/h5/,代表在域名的/h5目录下部署运行)
      /h5/
    启用https协议
    
    h5(根目录) -> 发行H5结果,将整个目录复制到Web项目的resources目录下(resources/h5)
      hybrid(可忽略该目录)
      static(静态资源目录) -> 访问Web项目的接口时只需使用相对路径
      index.html -> H5页面入口,在Web项目配置Servlet请求(template/index.html)
    
    Tip:发行前请将HBuilderX更新至最新版本,避免h5端产生浏览器兼容问题
    
    • Android原生App配置(HBuilderX)
    工具栏 - 发行 - 原生App-云打包 -> 生成Android安装包(*.apk)
    工具栏 - 发行 - 原生App-制作移动端App资源升级包 -> 生成Android升级包(*.wgt)
    1、在应用生命周期的onLaunch()中检测资源更新并自动下载(前端页面整体压缩包)
    2、在系统中安置检测更新的功能,用于整包更新(模块、配置、版本等变化)
    3、切换是否强制整包更新,通过资源更新修改功能的逻辑
    
    Web应用检测更新数据库设计(版本号依次向上迭代)
    | id | code | url | type | date |
    | 主键 | 版本号 | 下载地址 | 升级类型 | 更新日期 |
    | 1 | 101 | *.apk | 1 | 2020-01-01 |
    | 2 | 102 | *.wgt | 2 | 2020-01-01 |
    
    App应用检测当前版本方式
    plus.runtime.getProperty(plus.runtime.appid,function(info){  
        console.log("当前应用版本:"+info.version);  
    }); 
    
    let downloadTask = null;
    downloadTask = uni.downloadFile({
        url: *.apk,
        success: res => {
            if (res.statusCode === 200) {
                plus.runtime.install(
                    res.tempFilePath,
                    {
                        force: true
                    },
                    function() {
                        plus.runtime.restart();
                    },
                    function(e) {
                        console.error('install fail...');
                    }
                );
            }
        }
    });
    
    downloadTask.onProgressUpdate((res) => {
      console.log('下载进度' + res.progress + "%");  
      console.log('已下载大小:' + res.totalBytesWritten + "byte");  
      console.log('应用安装包大小:' + res.totalBytesExpectedToWrite + "byte");  
    });
    
    
    getFileSize(size) { -> 转换大小单位
        if (!size) return ""; -> 单位:byte
        var num = 1024.00; -> byte是最小单位
        if (size < num) return size + "B";
        if (size < Math.pow(num, 2)) return (size / num).toFixed(2) + "K";
        if (size < Math.pow(num, 3)) return (size / Math.pow(num, 2)).toFixed(2) + "M";
        if (size < Math.pow(num, 4)) return (size / Math.pow(num, 3)).toFixed(2) + "G";
        return (size / Math.pow(num, 4)).toFixed(2) + "T";
    }
    

    相关文章

      网友评论

          本文标题:Vue 渐进式框架

          本文链接:https://www.haomeiwen.com/subject/kbpufhtx.html