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

news2025/1/19 11:27:20

前言

个人认为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组件我没有写,随便定义一个就行,这些代码可以直接复制测试

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vs调试输出,不显示线程已退出

如题&#xff1a;一堆线程退出的信息&#xff0c;招人烦。 其实在vs设置里可以关闭&#xff1a; 工具-->选项-->调试-->输出窗口&#xff1a;

【Linux】权限的理解和使用

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

Linux程序之可变参数选项那些事!

一、linux应用程序如何接收参数&#xff1f; 1. argc、argv Linux应用程序执行时&#xff0c;我们往往通过命令行带入参数给程序&#xff0c;比如 ls /dev/ -l 其中参数 /dev/ 、-l都是作为参数传递给命令 ls 应用程序又是如何接收这些参数的&#xff1f; 通常应用程序都…

程序的执行原理(上)

文章目录 hello world程序源文件的本质是0和1hello world文件的ASCII表示程序被其他程序翻译成不同的格式预处理阶段编译阶段汇编阶段链接阶段 为什么需要了解编译系统的工作原理&#xff1f;优化程序性能理解链接时出现的错误避免安全漏洞 运行程序参考 hello world 程序源文件…

基于ZLMediaKit的GB28181视频平台demo

GB28181 主要内容 国标的20位id是按照标准来定的&#xff0c;前8位是地域信息&#xff0c;9-10位是行业信息&#xff0c;11-13是设备类型、14是网络标识、后6位为序号 约定以SIP协议作为会话通道的使用标准&#xff0c;以RTP作为语言和视频的载体。联网系统在进行音视频传输及…

AQS和ReentrantLock还能这样理解?

1.公平锁和非公平锁 1.1含义 公平锁:在竞争环境下&#xff0c;先到临界区的线程比后到的线程一定更快地获取得到锁。非公平锁:先到临界区的线程未必比后到的线程更快地获取得到锁。 1.2如何自我实现 公平锁实现&#xff1a;可以把竞争的线程放在一个先进先出的队列上。只要…

webpack plugin

1、基本写法及使用 这里用到 emit 钩子 及make 钩子&#xff0c;前者是串行后者是并行 /*** 1.webpack加载webpack.config.js中所有配置&#xff0c;此时就会new TestPlugin()&#xff0c;执行插件的constructor2.webpack创建compiler对象3.遍历所有plugins中插件&#xff0…

404 - File or directory not found.

iis部署的时候容易出现以下错误&#xff0c;造成的主要原因可能是IIS没有安装好某个组件或插件: 04-找不到文件或目录。 您要查找的资源可能已被删除、名称已更改或暂时不可用。 如果遇到该问题&#xff0c;安装iis的时候记得安装以下

AIGC ChatGPT4总结SQL优化细节操作

数据库SQL优化是一个复杂的过程,它通常涉及到许多不同的技术和方法。以下是一些常用的SQL优化策略: 1. **索引使用**:索引可以极大地加速查询速度。但是,索引并不总是有好处的,因为它们需要额外的空间来存储,并且在插入和更新数据时可能会减慢速度。因此,选择正确的字段…

【C++】类和对象——构造函数和析构函数

今天要学习两个特殊的函数&#xff0c;分别是构造函数和析构函数&#xff0c;它们究竟有什么用呢&#xff1f; 比如说&#xff0c;我们先写一个简单的日期的类 class Date { public:void Init() {_year 1;_month 1;_day 1;}void Print() {cout << _year << &qu…

字符串和内存函数(2)

文章目录 2.13 memcpy2.14 memmove2.15 memcmp2.16 memset 2.13 memcpy void* memcpy(void* destination, const void* source, size_t num); 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。这个函数在遇到 ‘\0’ 的时候并不会停下来。如果so…

企业计算机服务器中了locked勒索病毒怎么办,勒索病毒解密恢复

计算机网络为企业的生产生活提供了极大帮助&#xff0c;让企业逐步走向数字化办公&#xff0c;但随之而来的网络安全威胁也不断增多&#xff0c;网络勒索病毒病毒攻击企业计算机的事件频发&#xff0c;并且攻击加密手段也在不断提升。近期&#xff0c;云天数据恢复中心再次接到…

接口测试 —— requests 的基本了解

● requests介绍及安装 ● requests原理及源码介绍 ● 使用requests发送请求 ● 使用requests处理响应 ● get请求参数 ● 发送post请求参数 ● 请求header设置 ● cookie的处理 ● https证书的处理 ● 文件上传、下载 requests介绍 ● requests是python第三方的HTTP…

python -opencv 中值滤波 ,均值滤波,高斯滤波实战

python -opencv 中值滤波 &#xff0c;均值滤波&#xff0c;高斯滤波实战 cv2.blur-均值滤波 cv2.medianBlur-中值滤波 cv2.GaussianBlur-高斯滤波 直接看代码吧&#xff0c;代码很简单&#xff1a; import copy import math import matplotlib.pyplot as plt import matp…

第二十章 多线程

20.2创建线程 20.2.1继承Thread类 Thread类是Java.lang包中的一个类&#xff0c;从这个类中实例化的对象代表线程&#xff0c;程序员启动一个新线程需要建议Thread实例。 public class ThreadTest extedns Thread{} run方法格式&#xff1a; public void run(){} 20.1让线…

论设备管理的发展趋势及对策

作者&#xff1a;韩平 设备是企业生产要素的一个重要组成部分&#xff0c;是企业进行生产活动的物质硬件基础&#xff0c;也是决定企业生产效能的重要因素之一。 设备管理又称设备工程&#xff0c;是根据企业生产经营目标&#xff0c;为了提高设备效能&#xff0c;在调查研究…

主播产品话术

以电子产品为例 一、产品特点 1.高效性能:这款产品采用了最先进的技术&#xff0c;确保高效运行&#xff0c;让你的工作更加流畅。 2.便捷操作:设计简洁&#xff0c;操作方便&#xff0c;即使是不熟悉电子产品的人也能轻松上手。 3.时尚外观:多种颜色可选&#xff0c;满足你…

2023年09月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 点击绿旗,运行程序后,舞台上的图形是?( ) A:画笔粗细为4的三角形 B:画笔粗细为5的六边形 C:画笔粗细为4的六角形 D:画笔粗细为5的三角形 答案:D 第2题 如下图所示,从所给…

零编程基础Python的全面学习指南

文章目录 前言什么是编程&#xff1f;Python代码对应的机器码准备开始Windows变量类型整型字符串型布尔类型字符串连接和整数相加if 语句捕获用户输入导入MacWindows游戏时间&#xff01;小结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Pyt…

Postman API Enterprise 10.18.1 Crack

适合您企业的 Postman API 平台 掌控您的 API 环境。构建更好的 API。加快产品开发。 无论您处于 API 之旅的哪个阶段&#xff0c;Postman 都会为您提供帮助 想让您团队的 API 更容易被发现吗&#xff1f;希望减少开发和质量检查之间的滞后时间&#xff1f;想要更快地让新开发…