ソースを参照

Merge branch 'v2' of https://github.com/jdf2e/nutui into v2

guoxiaoxiao8 5 年 前
コミット
7e7ba7b60a

BIN
src/assets/img/dog.gif


BIN
src/assets/img/logo.png


+ 155 - 163
src/packages/leftslip/leftslip.vue

@@ -1,19 +1,11 @@
 <template>
     <div class="nut-leftslip">
         <div class="nut-leftslip-item" ref="slipItem" :style="deleteSlider">
-            <div
-                class="nut-leftslip-item-main"
-                @touchstart="touchStart($event)"
-                @touchmove="touchMove($event)"
-                @touchend="touchEnd($event)"
-            >
+            <div class="nut-leftslip-item-main" @touchstart="touchStart($event)" @touchmove="touchMove($event)"
+                @touchend="touchEnd($event)">
                 <slot name="slip-main"></slot>
             </div>
 
-            <!-- <div v-if="onlyDelBtn" class="delbtn" ref="delBtn">
-                <div :style="delBtnStyle" class="trans"></div>
-                <span @click.prevent="onlyDelClick($event)">删除</span></div
-            > -->
             <div class="nut-leftslip-item-btn">
                 <!-- <a @click.prevent="onlyDelClick($event)">删除</a> -->
                 <slot name="slipbtns">
@@ -24,179 +16,179 @@
     </div>
 </template>
 <script>
-export default {
-    name: 'nut-leftslip',
-    props: {
-        onlyDelBtn: {
-            type: Boolean,
-            default: false
-        },
-        btnSlipDel: {
-            type: Boolean,
-            default: false
-        }
-    },
-    data() {
-        return {
-            startX: 0,
-            startY: 0,
-            moveX: 0,
-            moveY: 0,
-            left: 0,
-            buttonWidth: 0,
-            disX: 0, //移动距离
-            deleteSlider: '', //滑动时的效果,使用v-bind:style="deleteSlider"
-            delBtnStyle: '' //单个删除键拖拽删除效果
-        };
-    },
-    mounted() {
-        this.$nextTick(() => {
-            if (this.onlyDelBtn) {
-                return;
-            }
-            for (var slot of this.$slots.slipbtns) {
-                this.buttonWidth = this.buttonWidth + slot.elm.offsetWidth;
-            }
-        });
-
-        window.addEventListener('scroll', this.handleScroll, true);
-    },
-    beforeDestroy() {
-        // 移除监听
-        window.removeEventListener('scroll', this.handleScroll, true);
-    },
-    methods: {
-        handleScroll() {
-            if (this.disX) {
-                this.restSlide();
+    export default {
+        name: 'nut-leftslip',
+        props: {
+            onlyDelBtn: {
+                type: Boolean,
+                default: false
+            },
+            btnSlipDel: {
+                type: Boolean,
+                default: false
             }
         },
-        handleClick() {
-            this.restSlide();
+        data() {
+            return {
+                startX: 0,
+                startY: 0,
+                moveX: 0,
+                moveY: 0,
+                left: 0,
+                buttonWidth: 0,
+                disX: 0, //移动距离
+                deleteSlider: '', //滑动时的效果,使用v-bind:style="deleteSlider"
+                delBtnStyle: '' //单个删除键拖拽删除效果
+            };
         },
-        onlyDelClick() {
-            //一键删除模式点击删除
-            this.$emit('oneDelete', this.$refs.slipItem);
-            this.restSlide();
+        mounted() {
+            this.$nextTick(() => {
+                if (this.onlyDelBtn) {
+                    return;
+                }
+                for (var slot of this.$slots.slipbtns) {
+                    this.buttonWidth = this.buttonWidth + slot.elm.offsetWidth;
+                }
+            });
+
+            window.addEventListener('scroll', this.handleScroll, true);
         },
-        touchStart(e) {
-            this.restSlide();
-            e = e || event;
-            //等于1时表示此时有只有一只手指在触摸屏幕
-            if (e.touches.length == 1) {
-                this.startX = e.touches[0].clientX;
-                this.startY = e.touches[0].clientY;
-            }
+        beforeDestroy() {
+            // 移除监听
+            window.removeEventListener('scroll', this.handleScroll, true);
         },
-        touchMove(e) {
-            e = e || event;
-            //获取当前滑动对象
-            let parentElement = e.currentTarget.parentElement;
-            //获取删除按钮的宽度,此宽度为滑块左滑的最大距离
-            let itemWd = this.$refs.slipItem.offsetWidth;
-            let wd = this.onlyDelBtn ? 40 : this.buttonWidth;
+        methods: {
+            handleScroll() {
+                if (this.disX) {
+                    this.restSlide();
+                }
+            },
+            handleClick() {
+                this.restSlide();
+            },
+            onlyDelClick() {
+                //一键删除模式点击删除
+                this.$emit('oneDelete', this.$refs.slipItem);
+                this.restSlide();
+            },
+            touchStart(e) {
+                this.restSlide();
+                e = e || event;
+                //等于1时表示此时有只有一只手指在触摸屏幕
+                if (e.touches.length == 1) {
+                    this.startX = e.touches[0].clientX;
+                    this.startY = e.touches[0].clientY;
+                }
+            },
+            touchMove(e) {
+                e = e || event;
+                //获取当前滑动对象
+                let parentElement = e.currentTarget.parentElement;
+                //获取删除按钮的宽度,此宽度为滑块左滑的最大距离
+                let itemWd = this.$refs.slipItem.offsetWidth;
+                let wd = this.onlyDelBtn ? 40 : this.buttonWidth;
 
-            if (e.touches.length == 1) {
-                // 滑动时距离浏览器左侧实时距离
-                this.moveY = e.touches[0].clientY;
-                this.moveX = e.touches[0].clientX;
-                if (Math.abs(this.moveY - this.startY) < 40) {
-                    //起始位置减去 实时的滑动的距离,得到手指实时偏移距离
-                    this.disX = this.startX - this.moveX;
-                    // console.log(this.disX);
-                    if (this.onlyDelBtn) {
-                        //单一删除,左滑一键删除
-                        if (this.disX < 0 || this.disX == 0) {
-                            this.deleteSlider = 'transform:translateX(0px)';
-                        }
-                        this.deleteSlider = 'transform:translateX(-' + this.disX + 'px)';
-                        this.delBtnStyle = 'width:' + this.disX + 'px';
-                        parentElement.dataset.type = 1; //设置滑动展开隐藏标志位,左滑展开为1,右滑或复位为0
-                    } else {
-                        // 如果是向右滑动或者不滑动,不改变滑块的位置
-                        if (this.disX < wd / 4 || this.disX == 0) {
-                            this.deleteSlider = 'transform:translateX(0px)';
-                            parentElement.dataset.type = 0;
-                        } else if (this.disX > wd / 4) {
-                            parentElement.dataset.type = 1;
+                if (e.touches.length == 1) {
+                    // 滑动时距离浏览器左侧实时距离
+                    this.moveY = e.touches[0].clientY;
+                    this.moveX = e.touches[0].clientX;
+                    if (Math.abs(this.moveY - this.startY) < 40) {
+                        //起始位置减去 实时的滑动的距离,得到手指实时偏移距离
+                        this.disX = this.startX - this.moveX;
+                        // console.log(this.disX);
+                        if (this.onlyDelBtn) {
+                            //单一删除,左滑一键删除
+                            if (this.disX < 0 || this.disX == 0) {
+                                this.deleteSlider = 'transform:translateX(0px)';
+                            }
                             this.deleteSlider = 'transform:translateX(-' + this.disX + 'px)';
-                            // 最大也只能等于删除按钮宽度
-                            if (this.disX * 1.5 >= wd) {
-                                // parentElement.dataset.type = 1;
-                                if (wd >= itemWd) {
-                                    this.deleteSlider = 'transform:translateX(-' + (itemWd - 40) + 'px)';
-                                } else {
-                                    this.deleteSlider = 'transform:translateX(-' + wd + 'px)';
+                            this.delBtnStyle = 'width:' + this.disX + 'px';
+                            parentElement.dataset.type = 1; //设置滑动展开隐藏标志位,左滑展开为1,右滑或复位为0
+                        } else {
+                            // 如果是向右滑动或者不滑动,不改变滑块的位置
+                            if (this.disX < wd / 4 || this.disX == 0) {
+                                this.deleteSlider = 'transform:translateX(0px)';
+                                parentElement.dataset.type = 0;
+                            } else if (this.disX > wd / 4) {
+                                parentElement.dataset.type = 1;
+                                this.deleteSlider = 'transform:translateX(-' + this.disX + 'px)';
+                                // 最大也只能等于删除按钮宽度
+                                if (this.disX >= wd) {
+                                    // parentElement.dataset.type = 1;
+                                    if (wd >= itemWd) {
+                                        this.deleteSlider = 'transform:translateX(-' + (itemWd - 40) + 'px)';
+                                    } else {
+                                        this.deleteSlider = 'transform:translateX(-' + wd + 'px)';
+                                    }
                                 }
                             }
                         }
                     }
                 }
-            }
-        },
-        touchEnd(e) {
-            e = e || event;
-            let parentElement = e.currentTarget.parentElement;
-            let itemWd = this.$refs.slipItem.offsetWidth;
-            let wd = this.onlyDelBtn ? 40 : this.buttonWidth;
-            if (e.changedTouches.length == 1) {
-                let endY = e.changedTouches[0].clientY;
-                if (Math.abs(this.startY - endY) < 40) {
-                    let endX = e.changedTouches[0].clientX;
-                    this.disX = this.startX - endX;
-                    // console.log('touchEndthis.disX:', this.disX);
-                    if (this.onlyDelBtn) {
-                        //单一按钮,左滑一键删除
-                        if (this.disX < 0 || this.disX == 0) {
-                            this.deleteSlider = 'transform:translateX(0px)';
-                            parentElement.dataset.type = 0;
-                        } else if (this.disX < itemWd - 20) {
-                            parentElement.dataset.type = 1;
-                            this.deleteSlider = 'transform:translateX(-50px);';
-                            this.delBtnStyle = ' width:0px;';
+            },
+            touchEnd(e) {
+                e = e || event;
+                let parentElement = e.currentTarget.parentElement;
+                let itemWd = this.$refs.slipItem.offsetWidth;
+                let wd = this.onlyDelBtn ? 40 : this.buttonWidth;
+                if (e.changedTouches.length == 1) {
+                    let endY = e.changedTouches[0].clientY;
+                    if (Math.abs(this.startY - endY) < 40) {
+                        let endX = e.changedTouches[0].clientX;
+                        this.disX = this.startX - endX;
+                        // console.log('touchEndthis.disX:', this.disX);
+                        if (this.onlyDelBtn) {
+                            //单一按钮,左滑一键删除
+                            if (this.disX < 0 || this.disX == 0) {
+                                this.deleteSlider = 'transform:translateX(0px)';
+                                parentElement.dataset.type = 0;
+                            } else if (this.disX < itemWd - 20) {
+                                parentElement.dataset.type = 1;
+                                this.deleteSlider = 'transform:translateX(-50px);';
+                                this.delBtnStyle = ' width:0px;';
+                            } else {
+                                this.deleteSlider = 'transform:translateX(-' + itemWd + 'px);';
+                                this.delBtnStyle = ' width:' + itemWd + 'px;';
+                                parentElement.dataset.type = 1;
+                                this.onlyDelClick();
+                            }
                         } else {
-                            this.deleteSlider = 'transform:translateX(-' + itemWd + 'px);';
-                            this.delBtnStyle = ' width:' + itemWd + 'px;';
-                            parentElement.dataset.type = 1;
-                            this.onlyDelClick();
-                        }
-                    } else {
-                        //如果距离小于删除按钮的四分之一,强行回到起点
+                            //如果距离小于删除按钮的四分之一,强行回到起点
 
-                        if (this.disX < wd / 4) {
-                            parentElement.dataset.type = 0;
-                            this.deleteSlider = 'transform:translateX(0px)';
-                        } else {
-                            //大于一半 滑动到最大值
-                            parentElement.dataset.type = 1;
-                            if (wd >= itemWd) {
-                                //按钮数不可超出整行宽度
-                                this.deleteSlider = 'transform:translateX(-' + (itemWd - 40) + 'px)';
+                            if (this.disX < wd / 4) {
+                                parentElement.dataset.type = 0;
+                                this.deleteSlider = 'transform:translateX(0px)';
                             } else {
-                                this.deleteSlider = 'transform:translateX(-' + wd + 'px)';
+                                //大于一半 滑动到最大值
+                                parentElement.dataset.type = 1;
+                                if (wd >= itemWd) {
+                                    //按钮数不可超出整行宽度
+                                    this.deleteSlider = 'transform:translateX(-' + (itemWd - 40) + 'px)';
+                                } else {
+                                    this.deleteSlider = 'transform:translateX(-' + wd + 'px)';
+                                }
                             }
                         }
-                    }
 
-                    // console.log('touchEnd:dataset', parentElement.dataset.type);
+                        // console.log('touchEnd:dataset', parentElement.dataset.type);
+                    }
                 }
-            }
-        },
-        restSlide() {
-            let listItems = document.querySelectorAll('.nut-leftslip-item');
+            },
+            restSlide() {
+                let listItems = document.querySelectorAll('.nut-leftslip-item');
 
-            // 复位
-            for (let i = 0; i < listItems.length; i++) {
-                listItems[i].style = 'transform:translateX(0' + 'px)';
-                listItems[i].dataset.type = 0; //是否展开标志位默认0,左滑展开为1,右滑隐藏为0
-            }
-            if (this.onlyDelBtn) {
-                let delBtns = document.querySelectorAll('.delbtn .trans');
-                for (let j = 0; j < delBtns.length; j++) {
-                    delBtns[j].style = '';
+                // 复位
+                for (let i = 0; i < listItems.length; i++) {
+                    listItems[i].style = 'transform:translateX(0' + 'px)';
+                    listItems[i].dataset.type = 0; //是否展开标志位默认0,左滑展开为1,右滑隐藏为0
+                }
+                if (this.onlyDelBtn) {
+                    let delBtns = document.querySelectorAll('.delbtn .trans');
+                    for (let j = 0; j < delBtns.length; j++) {
+                        delBtns[j].style = '';
+                    }
                 }
             }
         }
-    }
-};
-</script>
+    };
+</script>

+ 7 - 12
src/packages/qart/demo.vue

@@ -1,19 +1,13 @@
 <template>
     <div class="qartDemo">
         <h4>基础使用</h4>
-        <vue-qr :text="codeValue" :size="300"></vue-qr>
+        <vue-qr :text="codeValue"></vue-qr>
         <h4>背景图</h4>
-        <vue-qr :bgSrc="imageUrl" :text="codeValue" :size="300"></vue-qr>
+        <vue-qr :bg-src="imageUrl" :text="codeValue"></vue-qr>
         <h4>logo图</h4>
-        <vue-qr :logoSrc="imageUrl" :text="codeValue" :logoScale="0.5" :size="300"></vue-qr>
+        <vue-qr :logo-src="imageUrl" :text="codeValue" :logo-scale="0.5"></vue-qr>
         <h4>logo图+背景颜色</h4>
-        <vue-qr
-            :logoSrc="imageUrl"
-            :text="codeValue"
-            :logoScale="0.5"
-            :size="300"
-            backgroundColor="#F2140C"
-        ></vue-qr>
+        <vue-qr :logo-src="imageUrl" :text="codeValue" :logo-scale="0.5" background-color="#F2140C"></vue-qr>
         <h4>callback函数</h4>
         <vue-qr text="Hello world!" :callback="test" qid="testid"></vue-qr>
     </div>
@@ -22,8 +16,9 @@
 export default {
     data() {
         return {
-            imageUrl: require("./../../assets/img/logo.png"), //默认二维码中间图片
-            codeValue: "nutui.jd.com/"
+            imageUrl:
+                "https://img11.360buyimg.com/imagetools/jfs/t1/108423/20/14341/6907/5ea6b783E61a6cef3/55d0728276b2248d.png",
+            codeValue: "http://nutui.jd.com"
         };
     },
     methods: {

+ 41 - 37
src/packages/qart/doc.md

@@ -4,7 +4,7 @@
 ``` html
 <template>
     <div class="qartDemo">
-        <vue-qr :text="codeValue" :size="300"></vue-qr>
+        <vue-qr :text="codeValue"></vue-qr>
     </div>
 </template>
 ```
@@ -13,8 +13,9 @@
 export default {
     data() {
         return {
-            imageUrl: require("./../../assets/img/logo.png"), 
-            codeValue: "nutui.jd.com/"
+            imageUrl:
+                "https://img11.360buyimg.com/imagetools/jfs/t1/108423/20/14341/6907/5ea6b783E61a6cef3/55d0728276b2248d.png",
+            codeValue: "http://nutui.jd.com"
         };
     },
 };
@@ -25,7 +26,7 @@ export default {
 ``` html
 <template>
     <div class="qartDemo">
-        <vue-qr :bgSrc="imageUrl" :text="codeValue" :size="300"></vue-qr>
+        <vue-qr :bg-src="imageUrl" :text="codeValue" :size="300"></vue-qr>
     </div>
 </template>
 ```
@@ -34,8 +35,9 @@ export default {
 export default {
     data() {
         return {
-            imageUrl: require("./../../assets/img/logo.png"), 
-            codeValue: "nutui.jd.com/"
+            imageUrl:
+                "https://img11.360buyimg.com/imagetools/jfs/t1/108423/20/14341/6907/5ea6b783E61a6cef3/55d0728276b2248d.png",
+            codeValue: "http://nutui.jd.com"
         };
     },
 };
@@ -47,7 +49,7 @@ export default {
 ``` html
 <template>
     <div class="qartDemo">
-       <vue-qr :logoSrc="imageUrl" :text="codeValue" :logoScale="0.5" :size="300"></vue-qr>
+       <vue-qr :logo-src="imageUrl" :text="codeValue" :logo-scale="0.5" :size="300"></vue-qr>
     </div>
 </template>
 ```
@@ -56,8 +58,9 @@ export default {
 export default {
     data() {
         return {
-            imageUrl: require("./../../assets/img/logo.png"), 
-            codeValue: "nutui.jd.com/"
+            imageUrl:
+                "https://img11.360buyimg.com/imagetools/jfs/t1/108423/20/14341/6907/5ea6b783E61a6cef3/55d0728276b2248d.png",
+            codeValue: "http://nutui.jd.com"
         };
     },
 };
@@ -69,11 +72,11 @@ export default {
 <template>
     <div class="qartDemo">
          <vue-qr
-            :logoSrc="imageUrl"
+            :logo-src="imageUrl"
             :text="codeValue"
-            :logoScale="0.5"
+            :logo-scale="0.5"
             :size="300"
-            backgroundColor="#F2140C"
+            background-color="#F2140C"
         ></vue-qr>
     </div>
 </template>
@@ -83,8 +86,9 @@ export default {
 export default {
     data() {
         return {
-            imageUrl: require("./../../assets/img/logo.png"),
-            codeValue: "nutui.jd.com/"
+            imageUrl:
+                "https://img11.360buyimg.com/imagetools/jfs/t1/108423/20/14341/6907/5ea6b783E61a6cef3/55d0728276b2248d.png",
+            codeValue: "http://nutui.jd.com"
         };
     },
 };
@@ -116,27 +120,27 @@ export default {
 
 ## Prop
 
-| 字段                | 说明                                                                                                                                             | 类型     | 默认值  |
-| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | ------- |
-| text                | Contents to encode. 欲编码的内容                                                                                                                 | String   | 必传值  |
-| size                | 提前加载高度(数字 1 表示 1 屏的高度)                                                                                                           | Number   | 必传值  |
-| correctLevel        | Correct Level 0-3 容错级别 0-3                                                                                                                   | String   | -       |
-| margin              | 二维码图像的外边距, 默认 20px                                                                                                                    | String   | 20px    |
-| colorDark           | 实点的颜色                                                                                                                                       | String   | #000000 |
-| colorLight          | 空白区的颜色                                                                                                                                     | String   | #ffffff |
-| bgSrc               | 欲嵌入的背景图地址                                                                                                                               | String   | -       |
-| backgroundColor     | 背景色                                                                                                                                           | String   | -       |
-| backgroundDimming   | 叠加在背景图上的颜色, 在解码有难度的时有一定帮助                                                                                                 | String   | -       |
-| logoSrc             | 嵌入至二维码中心的 LOGO 地址                                                                                                                     | String   | -       |
-| logoScale           | 用于计算 LOGO 大小的值, 过大将导致解码失败, LOGO 尺寸计算公式 logoScale*(size-2*margin)                                                          | Number   | 0.2     |
-| logoMargin          | LOGO 标识周围的空白边框                                                                                                                          | Number   | 0       |
-| logoBackgroundColor | Logo 背景色,需要设置 logo margin                                                                                                                 | String   | -       |
-| logoCornerRadius    | 标识及其边框的圆角半径                                                                                                                           | Number   | 0       |
-| whiteMargin         | 背景图外将绘制白色边框                                                                                                                           | Boolean  | true    |
-| dotScale            | 数据区域点缩小比例(0 < scale < 1.0)                                                                                                              | Number   | 0.35    |
-| autoColor           | 背景图的主要颜色将作为实点的颜色                                                                                                                 | Boolean  | true    |
-| binarize            | 图像将被二值化处理, 未指定阈值则使用默认值                                                                                                       | Boolean  | true    |
-| binarizeThreshold   | 二值化处理的阈值(0 < threshold < 255)                                                                                                            | Number   | 128     |
-| callback            | 生成的二维码 Data URI 可以在回调中取得,第一个参数为二维码 data URL, 第二个参数为 props 传过来的 qid(因为二维码生成是异步的,所以加个 id 用于排序) | Function | —       |
-| bindElement         | 指定是否需要自动将生成的二维码绑定到HTML上                                                                                                       | Boolean  | true    |
+| 字段                  | 说明                                                                                                                                             | 类型     | 默认值  |
+| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | ------- |
+| text                  | Contents to encode. 欲编码的内容                                                                                                                 | String   | 必传值  |
+| size                  | 提前加载高度(数字 1 表示 1 屏的高度)                                                                                                           | Number   | 200     |
+| correct-level         | Correct Level 0-3 容错级别 0-3                                                                                                                   | String   | -       |
+| margin                | 二维码图像的外边距, 默认 20px                                                                                                                    | String   | 20px    |
+| color-dark            | 实点的颜色                                                                                                                                       | String   | #000000 |
+| color-light           | 空白区的颜色                                                                                                                                     | String   | #ffffff |
+| bg-src                | 欲嵌入的背景图地址                                                                                                                               | String   | -       |
+| background-color      | 背景色                                                                                                                                           | String   | -       |
+| background-dimming    | 叠加在背景图上的颜色, 在解码有难度的时有一定帮助                                                                                                 | String   | -       |
+| logo-src              | 嵌入至二维码中心的 LOGO 地址                                                                                                                     | String   | -       |
+| logo-scale            | 用于计算 LOGO 大小的值, 过大将导致解码失败, LOGO 尺寸计算公式 logoScale*(size-2*margin)                                                          | Number   | 0.2     |
+| logo-margin           | LOGO 标识周围的空白边框                                                                                                                          | Number   | 0       |
+| logo-background-color | Logo 背景色,需要设置 logo margin                                                                                                                 | String   | -       |
+| logo-corner-radius    | 标识及其边框的圆角半径                                                                                                                           | Number   | 0       |
+| white-margin          | 背景图外将绘制白色边框                                                                                                                           | Boolean  | true    |
+| dot-scale             | 数据区域点缩小比例(0 < scale < 1.0)                                                                                                              | Number   | 0.35    |
+| auto-color            | 背景图的主要颜色将作为实点的颜色                                                                                                                 | Boolean  | true    |
+| binarize              | 图像将被二值化处理, 未指定阈值则使用默认值                                                                                                       | Boolean  | true    |
+| binarize-threshold    | 二值化处理的阈值(0 < threshold < 255)                                                                                                            | Number   | 128     |
+| callback              | 生成的二维码 Data URI 可以在回调中取得,第一个参数为二维码 data URL, 第二个参数为 props 传过来的 qid(因为二维码生成是异步的,所以加个 id 用于排序) | Function | —       |
+| bind-element          | 指定是否需要自动将生成的二维码绑定到HTML上                                                                                                       | Boolean  | true    |
 > 更多内容请参照:[vue-qr 官方文档](https://github.com/Binaryify/vue-qr)

+ 99 - 93
src/packages/sidenavbar/demo.vue

@@ -2,130 +2,136 @@
   <div class="demo-list">
     <h4>基本用法</h4>
     <div>
-        <nut-cell :is-link="true" :show-icon="true" @click.native="showNav">
-            <span slot="title">
-                <label>右侧</label>
-            </span>
-        </nut-cell>
-        <nut-popup
-            position="right"
-            v-model="show1"
-            :style="{ width, height }"
-        >
-            <nut-sidenavbar :show="show1">
-                <nut-subsidenavbar title="图像理解" ikey="3" :open="false">
-                    <nut-sidenavbaritem ikey="4" title="菜品识别"></nut-sidenavbaritem>
-                    <nut-sidenavbaritem ikey="5" title="拍照购"></nut-sidenavbaritem>
-                </nut-subsidenavbar>
-                <nut-subsidenavbar title="自然语言处理" ikey="12">
-                    <nut-sidenavbaritem ikey="13" title="词法分析"></nut-sidenavbaritem>
-                    <nut-sidenavbaritem ikey="14" title="句法分析"></nut-sidenavbaritem>
-                </nut-subsidenavbar>
-            </nut-sidenavbar>
-        </nut-popup>
+      <nut-cell :is-link="true" :show-icon="true" @click.native="showNav">
+        <span slot="title">
+          <label>右侧</label>
+        </span>
+      </nut-cell>
+      <nut-popup position="right" v-model="show1" :style="{ width, height }">
+        <nut-sidenavbar :show="show1">
+          <nut-subsidenavbar title="图像理解" ikey="3" :open="false">
+            <nut-sidenavbaritem ikey="4" title="菜品识别"></nut-sidenavbaritem>
+            <nut-sidenavbaritem ikey="5" title="拍照购"></nut-sidenavbaritem>
+          </nut-subsidenavbar>
+          <nut-subsidenavbar title="自然语言处理" ikey="12">
+            <nut-sidenavbaritem ikey="13" title="词法分析"></nut-sidenavbaritem>
+            <nut-sidenavbaritem ikey="14" title="句法分析"></nut-sidenavbaritem>
+          </nut-subsidenavbar>
+        </nut-sidenavbar>
+      </nut-popup>
     </div>
     <div>
-        <nut-cell :is-link="true" :show-icon="true" @click.native="showNav2">
-            <span slot="title">
-                <label>左侧</label>
-            </span>
-        </nut-cell>
-        <nut-popup
-            position="left"
-            v-model="show2"
-            :style="{ width, height }"
-        >
-            <nut-sidenavbar>
-                <nut-subsidenavbar title="图像理解" ikey="3" :open="false">
-                    <nut-sidenavbaritem ikey="4" title="菜品识别"></nut-sidenavbaritem>
-                    <nut-sidenavbaritem ikey="5" title="拍照购"></nut-sidenavbaritem>
-                </nut-subsidenavbar>
-                <nut-subsidenavbar title="自然语言处理" ikey="12">
-                    <nut-sidenavbaritem ikey="13" title="词法分析"></nut-sidenavbaritem>
-                    <nut-sidenavbaritem ikey="14" title="句法分析"></nut-sidenavbaritem>
-                </nut-subsidenavbar>
-            </nut-sidenavbar>
-        </nut-popup>
+      <nut-cell :is-link="true" :show-icon="true" @click.native="showNav2">
+        <span slot="title">
+          <label>左侧</label>
+        </span>
+      </nut-cell>
+      <nut-popup position="left" v-model="show2" :style="{ width, height }">
+        <nut-sidenavbar>
+          <nut-subsidenavbar title="图像理解" ikey="3" :open="false">
+            <nut-sidenavbaritem ikey="4" title="菜品识别"></nut-sidenavbaritem>
+            <nut-sidenavbaritem ikey="5" title="拍照购"></nut-sidenavbaritem>
+          </nut-subsidenavbar>
+          <nut-subsidenavbar title="自然语言处理" ikey="12">
+            <nut-sidenavbaritem ikey="13" title="词法分析"></nut-sidenavbaritem>
+            <nut-sidenavbaritem ikey="14" title="句法分析"></nut-sidenavbaritem>
+          </nut-subsidenavbar>
+        </nut-sidenavbar>
+      </nut-popup>
     </div>
     <h4>导航嵌套(建议最多三层),点击第一条回调</h4>
     <div>
-        <nut-cell :is-link="true" :show-icon="true" @click.native="showNav3">
-            <span slot="title">
-                <label>显示</label>
-            </span>
-        </nut-cell>
-        <nut-popup
-            position="right"
-            v-model="show3"
-            :style="{ width, height }"
-        >
-            <nut-sidenavbar :show="show3">
-                <nut-sidenavbaritem ikey="1" title="人脸识别" @click="handleClick('人脸识别')"></nut-sidenavbaritem>
-                <nut-sidenavbaritem ikey="2" title="云存自然语言处理"></nut-sidenavbaritem>
-                <nut-subsidenavbar title="图像理解" ikey="3" :open="false">
-                    <nut-sidenavbaritem ikey="4" title="菜品识别"></nut-sidenavbaritem>
-                    <nut-sidenavbaritem ikey="5" title="拍照购"></nut-sidenavbaritem>
-                </nut-subsidenavbar>
-                <nut-subsidenavbar title="智能城市AI" ikey="6">
-                    <nut-sidenavbaritem ikey="7" title="企业风险预警模型"></nut-sidenavbaritem>
-                    <nut-sidenavbaritem ikey="8" title="水质量检测"></nut-sidenavbaritem>
-                    <nut-subsidenavbar title="人体识别" ikey="9">
-                        <nut-sidenavbaritem ikey="10" title="人体检测"></nut-sidenavbaritem>
-                        <nut-sidenavbaritem ikey="11" title="细粒度人像分割"></nut-sidenavbaritem>
-                    </nut-subsidenavbar>
-                </nut-subsidenavbar>
-                <nut-subsidenavbar title="自然语言处理" ikey="12">
-                    <nut-sidenavbaritem ikey="13" title="词法分析"></nut-sidenavbaritem>
-                    <nut-sidenavbaritem ikey="14" title="句法分析"></nut-sidenavbaritem>
-                </nut-subsidenavbar>
-            </nut-sidenavbar>
-        </nut-popup>
+      <nut-cell :is-link="true" :show-icon="true" @click.native="showNav3">
+        <span slot="title">
+          <label>显示</label>
+        </span>
+      </nut-cell>
+      <nut-popup position="right" v-model="show3" :style="{ width, height }">
+        <nut-sidenavbar :show="show3">
+          <nut-sidenavbaritem ikey="1" title="人脸识别" @click="handleClick('人脸识别')"></nut-sidenavbaritem>
+          <nut-sidenavbaritem ikey="2" title="云存自然语言处理"></nut-sidenavbaritem>
+          <nut-subsidenavbar title="图像理解" ikey="3" :open="false">
+            <nut-sidenavbaritem ikey="4" title="菜品识别"></nut-sidenavbaritem>
+            <nut-sidenavbaritem ikey="5" title="拍照购"></nut-sidenavbaritem>
+          </nut-subsidenavbar>
+          <nut-subsidenavbar title="智能城市AI" ikey="6">
+            <nut-sidenavbaritem ikey="7" title="企业风险预警模型"></nut-sidenavbaritem>
+            <nut-sidenavbaritem ikey="8" title="水质量检测"></nut-sidenavbaritem>
+            <nut-subsidenavbar title="人体识别" ikey="9">
+              <nut-sidenavbaritem ikey="10" title="人体检测"></nut-sidenavbaritem>
+              <nut-sidenavbaritem ikey="11" title="细粒度人像分割"></nut-sidenavbaritem>
+            </nut-subsidenavbar>
+          </nut-subsidenavbar>
+          <nut-subsidenavbar title="自然语言处理" ikey="12">
+            <nut-sidenavbaritem ikey="13" title="词法分析"></nut-sidenavbaritem>
+            <nut-sidenavbaritem ikey="14" title="句法分析"></nut-sidenavbaritem>
+          </nut-subsidenavbar>
+          <nut-subsidenavbar v-for="item in navs" :key="item.id" :title="item.name" :ikey="item.id">
+            <nut-sidenavbaritem v-for="citem in item.arr" :key="citem.id" :title="citem.name"></nut-sidenavbaritem>
+          </nut-subsidenavbar>
+        </nut-sidenavbar>
+      </nut-popup>
     </div>
   </div>
 </template>
 
 <script>
 export default {
-  components: {
-
-  },
+  components: {},
   data() {
     return {
-        show1: false,
-        show2: false,
-        show3: false,
-        width: '80%',
-        height: '100%'
+      show1: false,
+      show2: false,
+      show3: false,
+      width: "80%",
+      height: "100%",
+      navs: []
     };
   },
+  mounted() {
+    setTimeout(() => {
+      this.navs = [
+        {
+          id: 16,
+          name: "异步abc16",
+          arr: [{ pid: 16, id: 17, name: "abc16-id17" }]
+        },
+        {
+          id: 17,
+          name: "异步abc17",
+          arr: [{ pid: 17, id: 18, name: "abc17-id18" }]
+        }
+      ];
+    }, 2000);
+  },
   methods: {
     showNav() {
-        this.show1 = true
-        this.show2 = false
-        this.show3 = false
+      this.show1 = true;
+      this.show2 = false;
+      this.show3 = false;
     },
     showNav2() {
-        this.show1 = false
-        this.show2 = true
-        this.show3 = false
+      this.show1 = false;
+      this.show2 = true;
+      this.show3 = false;
     },
     showNav3() {
-        this.show1 = false
-        this.show2 = false
-        this.show3 = true
+      this.show1 = false;
+      this.show2 = false;
+      this.show3 = true;
     },
     handleClick(str) {
-        alert(str)
+      alert(str);
     }
   }
 };
 </script>
 
 <style lang="scss">
-.popup-bg{
+.popup-bg {
   z-index: 9999;
 }
-.popup-box{
+.popup-box {
   z-index: 9999;
 }
 </style>

+ 17 - 50
src/packages/video/demo.vue

@@ -2,7 +2,8 @@
     <div>
         <h4>基本用法</h4>
         <div class="video-con">
-            <nut-video :sources="sources" :options="options" @play="play" @pause="pause" @playend="playend"></nut-video>
+            <nut-video :sources="sources" :options="options" @play="play" @pause="pause" @playend="playend">
+            </nut-video>
         </div>
         <h4>自动播放</h4>
         <p>autoplay属性设置视频自动播放</p>
@@ -31,12 +32,13 @@
             <nut-video :sources="sources" :options="options6"></nut-video>
         </div>
         <h4>视频切换</h4>
-        <p>播放上一个、下一个视频</p>
-        <div class="video-con" ref="changeVideo">
+        <p>当视频地址发生变化时,重置视频</p>
+        <button @click="changeVideo">切换视频</button>
+        <div class="video-con">
             <nut-video :sources="sources1" :options="options"></nut-video>
         </div>
 
-        <button @click="prevVideo">播放上一个</button> <button @click="nextVideo">播放下一个</button>
+
     </div>
 </template>
 
@@ -92,19 +94,10 @@
 
             };
         },
+        mounted() {
+
+        },
         methods: {
-            play(elm) {
-                console.log('play', elm);
-            },
-            pause(e) {
-                console.log('pause');
-            },
-            playend(e) {
-                alert('播放结束');
-            },
-            testPlay(e) {
-                console.log('play', elm);
-            },
             changeVideo() {
                 this.sources1 = [
                     {
@@ -112,43 +105,17 @@
                         type: 'video/mp4'
                     }
                 ]
-
-                let videoElement = document.getElementById("testvideo").getElementsByTagName('video')[0];
-                videoElement.pause();
-                videoElement.removeAttribute('src');
-                videoElement.src = this.sources1.src;
-                videoElement.load();
             },
-            prevVideo() {
-                let videoCon = this.$refs.changeVideo
-                let player = videoCon.getElementsByTagName('video')[0];
-
-                this.sources1 = [
-                    {
-                        src: 'https://storage.jd.com/about/big-final.mp4?Expires=3730193075&AccessKey=3LoYX1dQWa6ZXzQl&Signature=ViMFjz%2BOkBxS%2FY1rjtUVqbopbJI%3D',
-                        type: 'video/mp4'
-                    }
-                ]
-                this.$nextTick(() => {
-                    player.load()
-                })
-
+            play(elm) {
+                console.log('play', elm);
+            },
+            pause(e) {
+                console.log('pause');
+            },
+            playend(e) {
+                alert('播放结束');
             },
-            nextVideo() {
-                let videoCon = this.$refs.changeVideo
-                let player = videoCon.getElementsByTagName('video')[0];
-
-                this.sources1 = [
-                    {
-                        src: 'http://vjs.zencdn.net/v/oceans.mp4',
-                        type: 'video/mp4'
-                    }
-                ]
-                this.$nextTick(() => {
-                    player.load()
-                })
 
-            }
         }
     };
 </script>

+ 4 - 26
src/packages/video/doc.md

@@ -159,10 +159,10 @@ export default {
 
 ## 视频切换
 
-播放上一个、下一个视频
+当视频地址发生变化时,重置视频
 
 ```html
-  	<div class="video-con" ref="changeVideo">
+  	<div class="video-con" >
 		<nut-video :sources="sources1" :options="options"></nut-video>
 	</div>
 ```
@@ -184,36 +184,14 @@ export default {
     	},
   	}
 	methods: {
-        prevVideo() {
-			let videoCon = this.$refs.changeVideo
-			let player = videoCon.getElementsByTagName('video')[0];
-			//改变视频源
-			this.sources1 = [
-				{
-					src: 'https://storage.jd.com/about/big-final.mp4?Expires=3730193075&AccessKey=3LoYX1dQWa6ZXzQl&Signature=ViMFjz%2BOkBxS%2FY1rjtUVqbopbJI%3D',
-					type: 'video/mp4'
-				}
-			]
-			this.$nextTick(() => {
-				player.load()
-			})
-
-		},
-		nextVideo() {
-			let videoCon = this.$refs.changeVideo
-			let player = videoCon.getElementsByTagName('video')[0];
-			//改变视频源
+        changeVideo() {
 			this.sources1 = [
 				{
 					src: 'http://vjs.zencdn.net/v/oceans.mp4',
 					type: 'video/mp4'
 				}
 			]
-			this.$nextTick(() => {
-				player.load()
-			})
-
-		}
+		},
     }
 };
 ```

+ 12 - 0
src/packages/video/video.vue

@@ -93,6 +93,18 @@
                 }
             };
         },
+        watch: {
+            sources: {
+                handler(newValue, oldValue) {
+                    if (newValue && oldValue && newValue != oldValue) {
+                        this.$nextTick(() => {
+                            this.videoElm.load()
+                        })
+                    }
+                },
+                immediate: true
+            }
+        },
         mounted() {
             this.init();
         },