vue2指令的使用和自定义指令

前言

个人认为vue的指令,对比react来说,给开发者节省了很大的学习成本。比如在react中,你想渲染一个列表,需要用Array.map的方法return<div>,而在vue中,一个简单的v-for就解决了问题。

在学习成本和入手体验上,vue的作者确实后来者居上,能让人更快的使用vue开发。不过也是老生常谈的问题,各有特点,不做过多比较。

vue中的指令是用在标签上或者组件上,是ui层和数据层的交互介质。这个官方没有这么说,是我自己说的,比如你使用v-if,通过data去控制ui,使用v-model实现ui和data的双向交互。

我这里并不是指令的具体教程,只是一些demo的测试效果。

示例

这里我将指令分为三块

简单指令:学习简单,使用简单

复杂指令:可以在组件上使用,或者有修饰符等

自定义指令:自定义一些指令去实现某些业务功能

简单指令

v-text

用来回显常规字符串的

 <h6>v-text使用</h6>
 <p>使用v-text----<span v-text="textValue"></span></p>
 <p>使用模板语法----<span>{{ textValue }}</span></p>

 //data
  textValue: '这是一段常规文字',

 效果

v-html

用来回显html的节点

<h6>v-html使用</h6>
<div v-html="htmlTemplate"></div>

//data
htmlTemplate: `<div><input/><button>按钮</button></div>`

效果

v-show

用来控制元素的样式回显

<h6>v-show使用</h6>
<el-checkbox v-model="checkedValue">开关</el-checkbox>
<p v-show="checkedValue">开启</p>
<p v-show="!checkedValue">关闭</p>

//data
checkedValue: true,

效果

 v-if & v-else-if & v-else

 用来控制元素的渲染

<h6>v-if && else-if && else的使用</h6>
<p>数字:{{ numValue }}</p>
<el-button @click="addNum">增加</el-button>
<el-button @click="deleteNum">减少</el-button>
<p v-if="numValue > 0">大于0</p>
<p v-else-if="numValue === 0">等于0</p>
<p v-else>小于0</p>

//data
numValue: 0,

//methods
addNum() {
  this.numValue++
},
deleteNum() {
  this.numValue--
},

 

 v-for

渲染数组类型

                    <h6>v-for使用</h6>
                    <ul>
                        <li v-for="(item, index) in listValue" :key="item.value">{{ item.label }}</li>
                    </ul>

//data
            listValue: [
                {
                    label: '文字1',
                    value: 'one'
                },
                {
                    label: '文字2',
                    value: 'two'
                },
                {
                    label: '文字3',
                    value: 'three'
                }
            ],

v-pre

跳过对js等变量的编译,渲染原始html

                    <h6>v-pre使用</h6>
                    <p v-pre>我是不需要编译的<span>{{ textValue }}</span></p>

//data
 textValue: '这是一段常规文字',

v-cloak

渲染完成之前的一种替代(网速慢优化策略)

                    <h6>v-cloak使用</h6>
                    <p v-cloak>
                        {{ textValue }}
                    </p>

v-once

元素只会渲染一次,更新不会重新渲染

                    <h6>v-once使用</h6>
                    <el-button @click="changeNumberVal">修改值</el-button>
                    <p v-once>不变的:{{ numberVal }}</p>
                    <p>变化的的:{{ numberVal }}</p>


//data
numberVal: 100,

//methods
        changeNumberVal() {
            this.numberVal++
        },

复杂指令

v-on

用来处理事件的

简写和动态事件
<h6>v-on使用(简写为@)</h6>
<el-button v-on:click="clickFun">常规点击</el-button>
<el-button @click="clickFun">简写常规点击</el-button>
<el-button v-on:[eventName]="clickFun">动态事件</el-button>
<el-button @[eventName]="clickFun">动态事件简写</el-button>
<el-button @click.once="clickFun">只生效一次</el-button>

//methods
        clickFun() {
            console.log('常规点击')
        },

依次点击按钮,最后一个按钮点击只触发依次

 

 阻止默认事件
<a href="http://www.baidu.com" @click="clickFun"><el-button>无限制跳转</el-button></a>
<a href="http://www.baidu.com" @click.prevent="clickFun"><el-button>阻止默认事件</el-button></a>

//methods
        clickFun() {
            console.log('常规点击')
        },

第一个按钮会先触发函数,再跳往至百度页面。

第二个按钮只会触发函数,不会跳转页面。

阻止事件冒泡
<span @click="clickSpanFun"><el-button @click="clickFun">节点嵌套事件冒泡</el-button></span>
<span @click="clickSpanFun"><el-button @click.stop="clickFun">阻止事件冒泡</el-button></span>

//methods
        clickFun() {
            console.log('常规点击')
        },
        clickSpanFun() {
            console.log('点击span标签')
        },

点击按钮1

点击按钮2

 其他事件和点击组件的修饰符
<input v-model="inputValue" @keyup.enter="inputEventFun" type="text">
<el-input v-model="inputValue" @keyup.native.enter="inputEventFun"></el-input>
<Child @click.native="componentClick"></Child>
v-bind

动态渲染值

<h6>v-bind使用</h6>
<p v-bind:class="className">动态class</p>
<p :style="styleName">动态样式加简写</p>
<el-button :name1="name1" :name2="name2" name3="属性3" ref="btn1" @click="checkBtn1">查看element按钮组件的自定义属性</el-button>
<button :name1="name1" :name2="name2" name3="属性3" ref="btn2" @click="checkBtn2">查看原生dom的自定义属性</button>

//data
            name1: '属性1',
            name2: JSON.stringify({
                value: '属性3'
            }),

 

依次点击两个按钮

v-model

输入框类型数据视图双向绑定

<h6>v-model使用</h6>
<p>常规v-model<el-input v-model="InputVal"></el-input></p>
<p>lazy修饰符<input v-model.lazy="InputLazyVal" @input="inputLazyFun" /></p>
<p>number修饰符<el-input v-model.number="InputNumberVal"></el-input></p>
<p>trim修饰符<el-input v-model.trim="InputTrimVal"></el-input></p>

v-slot

插槽,这里不说了,看插槽相关的文档吧

自定义指令

语法

全局注册和局部注册

局部注册

局部注册就是在当前组件里面写

<template>
   <div>
                   <h6>固定颜色指令</h6>
                <p v-color>固定红色的指令效果</p>
   </div>
</template>

<script>

export default{
    data(){
     return{
}
},
    directives: {
        color: {
            // 指令的定义
            inserted: function (el) {
                el.style.color = 'red'
            }
        }
    },
}

</script>

全局注册

创建一个js文件并在main.js中引入 

import Vue from 'vue'

Vue.directive('setColor',{
   //初始化钩子
   inserted:function(el,val,vnode){
    console.log(el,val,vnode,'???自定义函数')
     el.style.color = val.value || '#000'
   },
   //更新钩子
   update:function(el,val,vnode){
    console.log(el,val,vnode,'???自定义函数')
     el.style.color = val.value || '#000'
   },
})

引入后,任意组件内都可以使用

<h6>自定义颜色</h6>
 选择一个颜色吧:<el-color-picker v-model="colorValue"></el-color-picker>
 <p v-setColor="colorValue">我是一段可选择颜色的字段</p>


//data
colorValue:'#000'

 定义一个可拖拽的指令

vue组件

<h6>可拖拽指令</h6>
<div class="dragBox">
  <div class="dragContent" v-draggable></div>
</div>

<style lang="less">
  .dragBox {
    position: relative;
    width: 800px;
    height: 200px;
    border: 1px solid #000;

    .dragContent {
        position: absolute;
        width: 50px;
        height: 50px;
        background: red;
        cursor: move;
        left: 10px;
        top: 10px;
    }
}
</style>

定义指令

Vue.directive('draggable',{
    inserted: function (el) {
        el.onmousedown = function (e) {
            var disx = e.pageX - el.offsetLeft;
            var disy = e.pageY - el.offsetTop;
            document.onmousemove = function (e) {
                el.style.left = e.pageX - disx + 'px';
                el.style.top = e.pageY - disy + 'px';
            }
            document.onmouseup = function () {
                document.onmousemove = document.onmouseup = null;
            }
        }
    },
})

 

自定义指令在实际的项目中还是很重要的,可以实现很多的业务场景。

比如我个人就用指令完成过水印效果,拖拽,按钮权限的控制等,学会自定义指令,也是多少需要复习一下很多人抛弃已久的dom基础知识。

全部代码

vue组件

<template>
    <div class="box">
        <el-tabs v-model="activeName">
            <el-tab-pane label="简单指令(不需要修饰符)" name="first">
                <div class="content1">
                    <h6>v-text使用</h6>
                    <p>使用v-text----<span v-text="textValue"></span></p>
                    <p>使用模板语法----<span>{{ textValue }}</span></p>
                </div>
                <div class="content1">
                    <h6>v-html使用</h6>
                    <div v-html="htmlTemplate"></div>
                </div>
                <div class="content1">
                    <h6>v-show使用</h6>
                    <el-checkbox v-model="checkedValue">开关</el-checkbox>
                    <p v-show="checkedValue">开启</p>
                    <p v-show="!checkedValue">关闭</p>
                </div>
                <div class="content1">
                    <h6>v-if && else-if && else的使用</h6>
                    <p>数字:{{ numValue }}</p>
                    <el-button @click="addNum">增加</el-button>
                    <el-button @click="deleteNum">减少</el-button>
                    <p v-if="numValue > 0">大于0</p>
                    <p v-else-if="numValue === 0">等于0</p>
                    <p v-else>小于0</p>
                </div>
                <div class="content1">
                    <h6>v-for使用</h6>
                    <ul>
                        <li v-for="(item, index) in listValue" :key="item.value">{{ item.label }}</li>
                    </ul>
                </div>
                <div class="content1">
                    <h6>v-pre使用</h6>
                    <p v-pre>我是不需要编译的<span>{{ textValue }}</span></p>
                </div>
                <div class="content1">
                    <h6>v-cloak使用</h6>
                    <p v-cloak>
                        {{ textValue }}
                    </p>

                </div>
                <div class="content1">
                    <h6>v-once使用</h6>
                    <el-button @click="changeNumberVal">修改值</el-button>
                    <p v-once>不变的:{{ numberVal }}</p>
                    <p>变化的的:{{ numberVal }}</p>
                </div>
            </el-tab-pane>
            <el-tab-pane label="复杂指令" name="second">
                <div class="content2">
                    <h6>v-on使用(简写为@)</h6>
                    <el-button v-on:click="clickFun">常规点击</el-button>
                    <el-button @click="clickFun">简写常规点击</el-button>
                    <el-button v-on:[eventName]="clickFun">动态事件</el-button>
                    <el-button @[eventName]="clickFun">动态事件简写</el-button>
                    <el-button @click.once="clickFun">只生效一次</el-button>
                    <br>
                    <a href="http://www.baidu.com" @click="clickFun"><el-button>无限制跳转</el-button></a>
                    <a href="http://www.baidu.com" @click.prevent="clickFun"><el-button>阻止默认事件</el-button></a>
                    <br>
                    <p @click="clickPFun">
                        <span @click="clickSpanFun"><el-button @click="clickFun">节点嵌套事件冒泡</el-button></span>
                        <span @click="clickSpanFun"><el-button @click.stop="clickFun">阻止事件冒泡</el-button></span>
                    </p>
                    <br>
                    <input v-model="inputValue" @keyup.enter="inputEventFun" type="text">
                    <el-input v-model="inputValue" @keyup.native.enter="inputEventFun"></el-input>
                    <Child @click.native="componentClick"></Child>
                    <br>
                    <button v-on="{ mousedown: mousedownFun, mouseup: mouseUpFun }">对象语法</button>
                </div>
                <div class="content2">
                    <h6>v-bind使用</h6>
                    <p v-bind:class="className">动态class</p>
                    <p :style="styleName">动态样式加简写</p>
                    <el-button :name1="name1" :name2="name2" name3="属性3" ref="btn1"
                        @click="checkBtn1">查看element按钮组件的自定义属性</el-button>
                    <button :name1="name1" :name2="name2" name3="属性3" ref="btn2" @click="checkBtn2">查看原生dom的自定义属性</button>
                </div>
                <div class="content2">
                    <h6>v-model使用</h6>
                    <p>常规v-model<el-input v-model="InputVal"></el-input></p>
                    <p>lazy修饰符<input v-model.lazy="InputLazyVal" @input="inputLazyFun" /></p>
                    <p>number修饰符<el-input v-model.number="InputNumberVal"></el-input></p>
                    <p>trim修饰符<el-input v-model.trim="InputTrimVal"></el-input></p>
                </div>
                <div class="content2">
                    <h6>v-slot使用</h6>
                    具体参考插槽吧,这里不做演示了
                </div>
            </el-tab-pane>
            <el-tab-pane label="自定义指令" name="third">
                <h6>固定颜色指令</h6>
                <p v-color>固定红色的指令效果</p>
                <hr>
                <h6>自定义颜色</h6>
                选择一个颜色吧:<el-color-picker v-model="colorValue"></el-color-picker>
                <p v-setColor="colorValue">我是一段可选择颜色的字段</p>
                <hr>
                <h6>可拖拽指令</h6>
                <div class="dragBox">
                    <div class="dragContent" v-draggable></div>
                </div>
            </el-tab-pane>
        </el-tabs>

    </div>
</template>
<script>
import Child from './child.vue'
export default {
    name: 'instructions',
    data() {
        return {
            activeName: 'first',
            textValue: '这是一段常规文字',
            htmlTemplate: `<div><input/><button>按钮</button></div>`,
            checkedValue: true,
            numValue: 0,
            numberVal: 100,
            inputValue: '输入框的值',
            listValue: [
                {
                    label: '文字1',
                    value: 'one'
                },
                {
                    label: '文字2',
                    value: 'two'
                },
                {
                    label: '文字3',
                    value: 'three'
                }
            ],
            eventName: 'click',
            className: 'classP',
            styleName: {
                color: 'green'
            },
            name1: '属性1',
            name2: JSON.stringify({
                value: '属性3'
            }),
            InputVal: '常规输入框的值',
            InputLazyVal: 'lazy输入框的值',
            InputNumberVal: 1,
            InputTrimVal: '去空输入框的值',
            colorValue: '#000',
        }
    },
    directives: {
        color: {
            // 指令的定义
            inserted: function (el) {
                el.style.color = 'red'
            }
        }
    },
    components: {
        Child
    },
    methods: {
        addNum() {
            this.numValue++
        },
        deleteNum() {
            this.numValue--
        },
        changeNumberVal() {
            this.numberVal++
        },
        clickFun() {
            console.log('常规点击')
        },
        clickPFun() {
            console.log('点击p标签')
        },
        clickSpanFun() {
            console.log('点击span标签')
        },
        inputEventFun() {
            console.log(this.inputValue, '输入框的值')
        },
        componentClick(e) {
            console.log(e, '点击了组件')
        },
        mousedownFun() {
            console.log('鼠标按下')
        },
        mouseUpFun() {
            console.log('鼠标抬起')
        },
        checkBtn1() {
            let btn1 = this.$refs.btn1
            console.log(btn1, 'element组件按钮')
            console.log(btn1.$attrs['name1'], JSON.parse(btn1.$attrs['name2']), btn1.$attrs['name3'], '按钮的属性')
        },
        checkBtn2() {
            let btn2 = this.$refs.btn2
            console.log(btn2, 'btn的节点')
            console.log(btn2.getAttribute('name1'), JSON.parse(btn2.getAttribute('name2')), btn2.getAttribute('name3'), '按钮的属性')
        },
        inputLazyFun() {
            console.log(this.InputLazyVal, 'lazy值')
        },
    },
}
</script>
<style lang="less" scoped>
.box {
    padding: 14px;

    .content1 {
        float: left;
        width: 30%;
        height: 200px;
        margin: 10px;
        padding: 8px;
        box-shadow: 1px 1px 1px 1px #837e7e;

        h6 {
            font-size: 14px;
            font-weight: 600;
        }
    }

    .content2 {
        float: left;
        width: 40%;
        height: 350px;
        margin: 10px;
        padding: 8px;
        box-shadow: 1px 1px 1px 1px #837e7e;

        h6 {
            font-size: 14px;
            font-weight: 600;
        }
    }

}

[v-cloak] {
    display: none;
}

.classP {
    color: red;
}

.dragBox {
    position: relative;
    width: 800px;
    height: 200px;
    border: 1px solid #000;

    .dragContent {
        position: absolute;
        width: 50px;
        height: 50px;
        background: red;
        cursor: move;
        left: 10px;
        top: 10px;
    }
}
</style>

自定义指令文件

import Vue from 'vue'
import _ from 'lodash'
Vue.directive('setColor',{
   inserted:function(el,val,vnode){
    console.log(el,val,vnode,'???自定义函数')
     el.style.color = val.value || '#000'
   },
   update:function(el,val,vnode){
    console.log(el,val,vnode,'???自定义函数')
     el.style.color = val.value || '#000'
   },
})

Vue.directive('draggable',{
    inserted: function (el) {
        el.onmousedown = function (e) {
            var disx = e.pageX - el.offsetLeft;
            var disy = e.pageY - el.offsetTop;
            document.onmousemove = function (e) {
                el.style.left = e.pageX - disx + 'px';
                el.style.top = e.pageY - disy + 'px';
            }
            document.onmouseup = function () {
                document.onmousemove = document.onmouseup = null;
            }
        }
    },
})

那个child组件我没有写,随便定义一个就行,这些代码可以直接复制测试

感觉有用就给个赞吧!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/179766.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【unity实战】如何更加规范的创建各种Rogue-Lite(肉鸽)风格的物品和BUFF效果(附项目源码)

文章目录 前言定义基类实现不同的BUFF效果一、回血BUFF1. 简单的回血效果实现2. BUFF层数控制回血量 二、攻击附带火焰伤害三、治疗领域1. 简单的治疗领域实现2. 添加技能冷却时间 通过拾取物品获取对应的BUFF参考源码完结 前言 当创建各种Rogue-Lite&#xff08;肉鸽&#xf…

接口传参数list的时候,items里面放个​​​​​​​list

item里面放个list 先定义一个 list&#xff0c;循环add加入参数

xorm源码学习

文章目录 XORM源码浅析及实践ORMORM vs. SQLXORM软件架构 ORM 引擎 Engine——DBM*core.DB Golang&#xff1a;database/sql 源码基本结构连接复用&#xff0c;提高性能。增加数据库连接池数量连接管理 database/sql主要内容&#xff1a;sql.DB创建数据库连接sql.Open()DB.conn…

状态设计模式是什么?什么是 State 状态设计模式?Python 状态设计模式示例代码

什么是 State 状态设计模式&#xff1f; 状态设计模式是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态发生改变时改变其行为&#xff0c;使其看起来好像改变了其类。状态模式主要解决的问题是&#xff1a;当一个对象的行为取决于它的状态&#xff0c;并且在运行时…

2023年亚太地区数学建模大赛

中国新能源电动汽车的发展趋势 新能源汽车是指采用先进的技术原理、新技术和新结构&#xff0c;以非常规车用燃料&#xff08;非常规车用燃料是指汽油和柴油以外的燃料&#xff09;为动力源&#xff0c;集成先进的汽车动力控制和驱动技术的汽车。新能源汽车包括四大类型&#…

人工智能带来的各方面影响

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术在各个领域中的应用越来越广泛&#xff0c;已经开始对我们的生活方式、社会和经济结构产生深远的影响。 1.人工智能家庭化。人工智能技术使我们的生活变得更加便利和智能化。在家庭日常中&#xff0c;智能家居、智能…

WPF绘图使用介绍

文章目录 WPF绘图基本用法绘制直线在XAML中绘制直线在C#代码中绘制直线使用Path绘制直线注意 矩形绘制在XAML中绘制矩形在C#代码中绘制矩形设置矩形的位置使用圆角矩形 画刷1. SolidColorBrush2. LinearGradientBrush3. RadialGradientBrush4. ImageBrush5. DrawingBrush6. Vis…

FDG6306P PowerTrench® MOSFET P沟道 特点及其应用详解

关于PowerTrench MOSFET&#xff1f; 它是一种MOS场效应晶体管&#xff0c;可以提高系统效率和功率密度。该技术采用了屏蔽栅极技术&#xff0c;可以减少开关损耗和导通损耗&#xff0c;从而提高了系统效率。此外&#xff0c;PowerTrench MOSFET还具有低导通电阻和高开关速度的…

Python---函数的应用案例(多个)涉及函数、字符串翻转修改

案例&#xff1a;使用print方法打印一条横线 下面是最原始的方法&#xff1a; print(- * 40) 案例&#xff1a;对上个案例进行升级&#xff0c;可以根据输入的num数值&#xff0c;生成指定数量的横线 相关链接Python----range方法&#xff08;函数&#xff09;-CSDN博客 Pyt…

现代计算与光学的跨界机遇——

时至今日&#xff0c;互补氧化金属半导体&#xff08;CMOS&#xff09;技术的飞速发展促进了集成电路的空前成功。 晶体管的创新与时俱进 正如戈登-E-摩尔&#xff08;Gordon E. Moors&#xff09;在1965年预测的那样&#xff0c;每隔18-24个月&#xff0c;计算芯片上的晶体管数…

手把手教你通过CODESYS V3进行PLC编程(二)

教程背景 在上一期教程中&#xff0c;我们已经完成了控制器设备的连接和配置。接下来的教程将继续以宏集MC-Prime为例&#xff0c;假设控制器已经配置并连接到开发者的PC上&#xff0c;为您演示如何为控制器安装合适的CODESYS V3版本并创建第一个程序。 一、安装CODESYS &…

TikTok青年领袖:短视频如何塑造新一代

在数字时代的潮流中&#xff0c;短视频平台TikTok崭露头角&#xff0c;成为年轻一代最喜爱的社交媒体之一。这个平台不仅改变了用户的娱乐方式&#xff0c;更在其中催生了一批富有创造力和影响力的青年领袖。 本文将深入探讨TikTok如何通过短视频内容塑造新一代的青年领袖&…

Modbus转Profinet改变局面,PLC与电力仪表秒级响应

Modbus转Profinet改变了传统的局面&#xff0c;实现了PLC与电力仪表之间的秒级响应。在过去&#xff0c;由于Modbus通信协议的限制&#xff0c;PLC与电力仪表之间的数据传输速度受到了很大的限制&#xff0c;无法满足工业自动化领域对实时性的要求。然而&#xff0c;随着Modbus…

加班做报表被嘲低效!快用大数据分析工具

做数据分析报表很耗时间&#xff0c;因为不仅要解决多业务系统数据质量标准不一问题&#xff0c;还需要进行大量的公式计算、报表设计与制作。但那是以前&#xff0c;在大数据分析工具强势崛起的当下&#xff0c;这些工作都能交给大数据分析工具来做了。以前是花90%的时间做报表…

快慢指针判断环形链表

我们在前面文章中写过用快慢指针判断链表是否带环&#xff1a; leetcode&#xff1a;环形链表-CSDN博客 我们用的是slow指针一次走一步&#xff0c;fast指针一次走两步&#xff0c;当slow入环后开始了追击&#xff0c;每走一次距离缩短1&#xff0c;最终就会相遇 思考问题 …

CURL踩坑记录

因为项目使用的windows server&#xff0c;且没有安装Postman&#xff0c;所以对于在本地的Postman上执行的请求&#xff0c;要拷贝到服务器执行&#xff0c;只能先转化成为curl命令&#xff0c;操作也很简单&#xff0c;如下&#xff1a; 注意&#xff0c;Postman默认对url包围…

Vocoder,声码器详解——语音信号处理学习(十)

参考文献&#xff1a; [1] Vocoder (由助教許博竣同學講授)哔哩哔哩bilibili [2] Oord A, Dieleman S, Zen H, et al. Wavenet: A generative model for raw audio[J]. arXiv preprint arXiv:1609.03499, 2016. [3] https://deepmind.com/blog/article/wavenet-generative-mode…

关于实时云渲染并发问题的分享,实时云渲染到底能不能省显卡?

近期遇到很多客户咨询实时云渲染技术中的并发问题&#xff0c;在这里点量小芹针对这个问题的几个常见疑惑进行集中的解答分享&#xff0c;希望对有迷惑的朋友有所启发和帮助。 第一个问题&#xff0c;实时云渲染能否扩展一张显卡支持的并发数&#xff1f; 实时云渲染是一个新兴…

没有淘礼金权限怎么办?

前面我写了一篇微信公众号创建淘礼金的博文&#xff0c;在实际开发中不少人遇到了&#xff0c;淘礼金没有权限的问题。 既然没权限&#xff0c;解决方法就是去申请权限&#xff0c; 只需要满足以下规则&#xff0c;就可以自主申请开通。 申请规则&#xff1a; &#xff11;&a…

uni-app 跨端开发注意事项

文章目录 前言H5正常但App异常的可能性标题二H5正常但小程序异常的可能性小程序正常但App异常的可能性小程序或App正常&#xff0c;但H5异常的可能性App正常&#xff0c;小程序、H5异常的可能性使用 Vue.js 的注意区别于传统 web 开发的注意H5 开发注意微信小程序开发注意支付宝…