前端技术前沿2

作者: 魔王哪吒 | 来源:发表于2019-05-20 00:22 被阅读10次
    wx.showToast({
      title: '成功',
      icon: 'success',
      duration: 2000
    })
    wx.showModal({
      title: '提示',
      content: '这是一个模态弹窗',
      success: function(res) {
        if (res.confirm) {
          console.log('用户点击确定')
        } else if (res.cancel) {
          console.log('用户点击取消')
        }
      }
    })
    
    <template lang="wxml">
        
        <view class="ui-toast  {{ className }}" hidden="{{ !visible }}">
            <view class="ui-toast_bd">
                <icon wx:if="{{ options.icon}}" type="{{ options.icon }}" size="40" color="{{ options.color }}" class="ui-toast_icon" />
                <view class="ui-toast_text">{{ options.text }}</view>
            </view>
        </view>
    </template>
    
    <script>
        import wepy from 'wepy';
        const __timer__ =1900;
        class Toast extends wepy.component {
                
            /**
             * 默认数据
             */
            data={
                 list:[
                    {
                        type: `success`,
                        icon: `success`,
                        className: `ui-toast-success`,
                    },
                    {
                        type: `cancel`,
                        icon: `cancel`,
                        className: `ui-toast-cancel`,
                    },
                    {
                        type: `forbidden`,
                        icon: `warn`,
                        className: `ui-toast-forbidden`,
                    },
                    {
                        type: `text`,
                        icon: ``,
                        className: `ui-toast-text`,
                    },
                ],
                timer:null,
                scope: `$ui.toast`, 
                animateCss:'animateCss',
                className:'',
                visible:!1,
                options:{
                    type: ``, 
                    timer: __timer__, 
                    color: `#fff`, 
                    text: `已完成`, 
                }
            }
            /**
             * 默认参数
             */
            __setDefaults__() {
                return {
                    type: `success`, 
                    timer: __timer__, 
                    color: `#fff`, 
                    text: `已完成`, 
                    success() {}, 
                }
            }
            /**
             * 设置元素显示
             */
            __setVisible__(className = `ui-animate-fade-in`) {
                this.className = `${this.animateCss} ${className}`;
                this.visible = !0;
                this.$apply();
            }
    
            /**
             * 设置元素隐藏
             */
            __setHidden__(className = `ui-animate-fade-out`, timer = 300) {
                this.className = `${this.animateCss} ${className}`;
                this.$apply();
                setTimeout(() => {
                    this.visible = !1;
                    this.$apply();
                }, timer)
            }
            /**
             * @param {Object} opts 配置项
             * @param {String} opts.type 提示类型
             * @param {Number} opts.timer 提示延迟时间
             * @param {String} opts.color 图标颜色
             * @param {String} opts.text 提示文本
             * @param {Function} opts.success 关闭后的回调函数
             */
            __show__(opts = {}) {
                let options = Object.assign({}, this.__setDefaults__(), opts)
                const TOAST_TYPES = this.list;
                TOAST_TYPES.forEach((value, key) => {
                    if (value.type === opts.type) {
                        options.icon = value.icon;
                        options.className = value.className
                    }
                })
                this.options = options;
                if(!this.options.text){
                    return ;
                };
                clearTimeout(this.timer);
                this.__setVisible__();
                this.$apply();
                this.timer = setTimeout(() => {
                    this.__setHidden__()
                    options.success&&options.success();
                }, options.timer);
    
            }
            __info__(args=[]){
                let [ message, callback, duration ]  = args;
                this.__show__({
                    type: 'text',
                    timer: (duration||__timer__),
                    color: '#fff',
                    text: message,
                    success: () => {callback&&callback()}
                });
            }
            __success__(args=[]){
                let [ message, callback, duration ]  = args;
                this.__show__({
                    type: 'success',
                    timer: (duration||__timer__),
                    color: '#fff',
                    text: message,
                    success: () => {callback&&callback()}
                });
            }
            __warning__(args){
                let [ message, callback, duration ]  = args;
                this.__show__({
                    type: 'forbidden',
                    timer: (duration||__timer__),
                    color: '#fff',
                    text: message,
                    success: () => {callback&&callback()}
                });
            }
            __error__(args){
                let [ message, callback, duration ]  = args;
                this.__show__({
                    type: 'cancel',
                    timer: (duration||__timer__),
                    color: '#fff',
                    text: message,
                    success: () => {callback&&callback()}
                });
            }
            __showLoading__(options){
                wx.showLoading({
                    title: (options&&options.title||"加载中"),
                });
            }
            __hideLoading__(){
                wx.hideLoading();
            }
            onLoad(){
                this.$apply()
            }
        }
    
        export default Toast;
    </script>
    
    <template>
        <view class="demo-page">
            <Toast />
            <Modals />
        </view>
    </template>
    
    <script>
        import wepy from 'wepy'
        import Toast from '../components/ui/Toast'
        import Modals from '../components/ui/Modals'
        import {fetchJson} from '../utils/fetch';
    
        export default class Index extends wepy.page {
            config = {
                navigationBarBackgroundColor: "#0ECE8D",
          navigationBarTextStyle:"white",
                navigationBarTitleText: ''
            }
            components = {
                Toast: Toast,
                Modals: Modals
            }
            methods = {
                tapToast(){
                    this.$invoke("Toast","__success__",[`提交成功`]);
                }   
            }
        }
    </script>
    
    image.png 微信审核通过邮件模板 image.png

    https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_10&index=1

    微信小程序WePY开发框架

    npm install -g wepy-cli
    
    // 1.7.0之前
    wepy new myproject
    // 1.7.0之后
    wepy init standard myproject
    
    wepy --version
    
    npm install
    
    npm run dev
    
    wepy build --watch
    
    project.config.json
    {
      "description": "A WePY project",
      "setting": {
        "urlCheck": true,
        "es6": false,
        "postcss": false,
        "minified": false,
        "newFeature": true
      },
      "compileType": "miniprogram",
      "appid": "touristappid",
      "projectname": "hellowepy",
      "miniprogramRoot": "./dist",
      "condition": {}
    }
    
    es6: 对应关闭ES6转ES5选项,关闭。 
    postcss: 对应关闭上传代码时样式自动补全选项,关闭。 
    minified: 对应关闭代码压缩上传选项,关闭。
    urlCheck: 对应不检查安全域名选项,开启。
    
    wepy.config.js配置文件说明
    

    sass:sass编译配置,参见这里。https://github.com/sass/node-sass
    less:less编译配置,参见这里。http://lesscss.org/#using-less-usage-in-code
    postcss:postcss编译配置,参见这里。http://www.css88.com/archives/7317
    stylus:stylus编译配置,参见这里。http://www.zhangxinxu.com/jq/stylus/js.php
    babel:babel编译配置,参见这里。http://babeljs.io/docs/usage/options/
    typescript:typescript编译配置,参见这里。https://www.tslang.cn/docs/home.html

    app小程序实例
    import wepy from 'wepy';
    
    export default class MyAPP extends wepy.app {
      customData = {};
    
      customFunction () {}
    
      onLaunch () {}
    
      onShow () {}
    
      config = {}  // 对应 app.json 文件
    
      globalData = {}
    }
    

    page页面实例和Component组件实例

    import wepy from 'wepy';
    
    export default class MyPage extends wepy.page {
    //export default class MyComponent extends wepy.component {
      customData = {} //自定义数据
    
      customFunction () {} //自定义方法
    
      onLoad () {} //在Page和Component共用的生命周期函数
    
      onShow () {} //只在Page中存在的页面生命周期函数
    
      config = {}; //只在Page实例中存在的配置数据,对应于原生的page.json文件
    
      data = {}; //页面所需数据均需在这里声明,可用于模板数据绑定
    
      components = {}; //声明页面中所引用的组件,或声明组件中所引用的子组件
    
      mixins = []; //声明页面所引用的Mixin实例
    
      computed = {}; //声明计算属性
    
      watch = {}; //声明数据watcher
    
      methods = {}; //声明页面wxml中标签的事件处理函数。
    
      events = {}; //声明组件之间的事件处理函数
    }
    

    循环渲染

    <template>
        <!-- 注意,使用for属性,而不是使用wx:for属性 -->
        <repeat for="{{list}}" key="index" index="index" item="item">
            <!-- 插入<script>脚本部分所声明的child组件,同时传入item -->
            <child :item="item"></child>
        </repeat>
    </template>
    
    <script>
        import wepy from 'wepy';
        // 引入child组件文件
        import Child from '../components/child';
    
        export default class Index extends wepy.component {
            components = {
                // 声明页面中要使用到的Child组件的ID为child
                child: Child
            }
    
            data = {
                list: [{id: 1, title: 'title1'}, {id: 2, title: 'title2'}]
            }
        }
    </script>
    
    data = {
      a: 1
    }
    
    //计算属性aPlus,在脚本中可通过this.aPlus来引用,在模板中可通过{{ aPlus }}来插值
    computed = {
      aPlus () {
        return this.a + 1
      }
    }
    
    data = {
        num: 1
    }
    
    watch = {
        num (newValue, oldValue) {
            console.log(`num value: ${oldValue} -> ${newValue}`)
        }
    }
    
    onLoad () {
        setInterval(() => {
            this.num++;
            this.$apply();
        }, 1000)
    }
    

    props

    // parent.wpy
    
    <child :title="parentTitle" :syncTitle.sync="parentTitle" :twoWayTitle="parentTitle"></child>
    
    data = {
        parentTitle: 'p-title'
    };
    
    
    // child.wpy
    
    props = {
        // 静态传值
        title: String,
    
        // 父向子单向动态传值
        syncTitle: {
            type: String,
            default: 'null'
        },
    
        twoWayTitle: {
            type: String,
            default: 'nothing',
            twoWay: true
        }
    };
    
    onLoad () {
        console.log(this.title); // p-title
        console.log(this.syncTitle); // p-title
        console.log(this.twoWayTitle); // p-title
    
        this.title = 'c-title';
        console.log(this.$parent.parentTitle); // p-title.
        this.twoWayTitle = 'two-way-title';
        this.$apply();
        console.log(this.$parent.parentTitle); // two-way-title.  --- twoWay为true时,子组件props中的属性值改变时,会同时改变父组件对应的值
        this.$parent.parentTitle = 'p-title-changed';
        this.$parent.$apply();
        console.log(this.title); // 'c-title';
        console.log(this.syncTitle); // 'p-title-changed' --- 有.sync修饰符的props属性值,当在父组件中改变时,会同时改变子组件对应的值。
    }
    
    import wepy from 'wepy'
    export default class Com extends wepy.component {
        components = {};
        data = {};
        methods = {};
        events = {
            'some-event': (p1, p2, p3, $event) => {
                   console.log(`${this.$name} receive ${$event.name} from ${$event.source.$name}`);
            }
        };
    }
    
    Page_Index中调用组件ComA的某个方法
    this.$invoke('ComA', 'someMethod', 'someArgs');
    
    组件ComA中调用组件ComG的某个方法
    this.$invoke('./../ComB/ComG', 'someMethod', 'someArgs');
    

    slot 组件插槽

    <view class="panel">
        <slot name="title">默认标题</slot>
        <slot name="content">默认内容</slot>
    </view>
    
    <panel>
        <view slot="title">新的标题</view>
        <view slot="content">
            <text>新的内容</text>
        </view>
    </panel>
    
    <!-- 推荐用法 --->
    // list.wpy
    <repeat for="{{mylist}}">
        <view>{{item.name}}</view>
    </repeat>
    
    // index.wpy
    <List :mylist.sync="mylist"></List>
    
    // 原生的事件传参方式:
    <view data-id="{{index}}" data-title="wepy" data-other="otherparams" bindtap="tapName"> Click me! </view>
    
    Page({
        tapName: function (event) {
            console.log(event.currentTarget.dataset.id)// output: 1
            console.log(event.currentTarget.dataset.title)// output: wepy
            console.log(event.currentTarget.dataset.other)// output: otherparams
        }
    });
    
    // WePY 1.1.8以后的版本,只允许传string。
    <view @tap="tapName({{index}}, 'wepy', 'otherparams')"> Click me! </view>
    
    methods: {
        tapName (id, title, other, event) {
            console.log(id, title, other)// output: 1, wepy, otherparams
        }
    }
    
    // 原生代码:
    wx.request({
        url: 'xxx',
        success: function (data) {
            console.log(data);
        }
    });
    
    // WePY使用方式, 需要开启Promise支持
    wepy.request('xxxx').then((d) => console.log(d));
    
    // async/await的使用方式, 需要开启Promise和async/await支持
    async function request () {
       let d = await wepy.request('xxxxx');
       console.log(d);
    }
    
    import wepy from 'wepy';
    
    export default class extends wepy.app {
        constructor () {
            // this is not allowed before super()
            super();
            // 拦截request请求
            this.intercept('request', {
                // 发出请求时的回调函数
                config (p) {
                    // 对所有request请求中的OBJECT参数对象统一附加时间戳属性
                    p.timestamp = +new Date();
                    console.log('config request: ', p);
                    // 必须返回OBJECT参数对象,否则无法发送请求到服务端
                    return p;
                },
    
                // 请求成功后的回调函数
                success (p) {
                    // 可以在这里对收到的响应数据对象进行加工处理
                    console.log('request success: ', p);
                    // 必须返回响应数据对象,否则后续无法对响应数据进行处理
                    return p;
                },
    
                //请求失败后的回调函数
                fail (p) {
                    console.log('request fail: ', p);
                    // 必须返回响应数据对象,否则后续无法对响应数据进行处理
                    return p;
                },
    
                // 请求完成时的回调函数(请求成功或失败都会被执行)
                complete (p) {
                    console.log('request complete: ', p);
                }
            });
        }
    }
    

    请点赞!因为你的鼓励是我写作的最大动力!

    官方微信公众号

    吹逼交流群:711613774

    吹逼交流群

    相关文章

      网友评论

        本文标题:前端技术前沿2

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