区间组件cCompare——属性选择系列组件库(design by yRan)

本组件二次封装iview和element,可以在全局安装了Iview和element的项目或者局部引入了Select和el-input的页面中自由使用。

目录

效果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从左到右分别是:维度选择器、比较数值或区间

从上到下分别是:选择比较符号输入比较数值的区间、比较符号、选中范围时输入比较区间

功能描述

  1. 选择比较符号的时候,后面输入比较的数值
  2. 选择范围选项的时候,后面输入范围区间
  3. 本组件依赖于组件nToN

结构代码

<template>
  <div class="c-compare">
    <Select
      v-model="judge"
      placeholder="比较"
      style="width: 80px"
      @on-open-change="judge_change"
    >
      <Option v-for="item in judgeList" :value="item.value" :key="item.value">{{
        item.label
      }}</Option>
    </Select>
    <InputNumber
      v-if="judge !== 7"
      v-model="judgeNum"
      :value="judgeNum"
      :min="0"
      @on-blur="getNum"
    ></InputNumber>
    <nToN v-if="judge === 7" @func="setData" :initNum="init_num" :num-flag="1"></nToN>
  </div>
</template>
  • judge变化决定第二个组件
  • judgeNum和父组件双向绑定,v-model和value实现

逻辑代码

props: {
    init_judge: {
      type: Number,
      default () {
        return 0
      }
    },
    value: {
      type: Number
    },
    initNum: {
      type: Object,
      default () {
        return {
          minNum: '',
          maxNum: ''
        }
      }
    }
  },
  computed: {
    judgeNum: {
      get () {
        return this.value
      },
      set (val) {
        this.$emit('input', val)
        if (!this.judge) {
          this.judge = 1
          this.judgelabel = '>'
        }
        if (this.judge !== 7) {
          this.$emit('getData', this.judgelabel, this.judge, this.judgeNum, null)
        } else {
          this.$emit(
            'getData',
            this.judgelabel,
            this.judge,
            this.judgeRange,
            this.judgeContent
          )
        }
      }
    }
  },
  data () {
    return {
      attrBox: attrBox,
      init_num: this.initNum,
      judge: this.init_judge,
      judgelabel: '',
      judgeContent: '',
      judgeRange: {
        min: '',
        max: ''
      },
      judgeList: attrBox.judgeList
    }
  },
  watch: {
    init_judge (n, o) {
      this.judge = n
    }
  },
  methods: {
    setData (data) {
      this.judgeContent = ntnData_handle(data).content
      this.judgeRange = ntnData_handle(data).range
      this.$emit(
        'getData',
        this.judgelabel,
        this.judge,
        this.judgeRange,
        this.judgeContent
      )
    },
    getNum () {
      if (typeof this.judgeNum === 'number') {
      } else {
        this.$Message.info('这里有默认值哦~可以自行修改哦o(* ̄▽ ̄*)ブ')
        this.judgeNum = 1
      }
    },
    judge_change (open) {
      if (!open) {
        if (typeof this.judge === 'number') {
          if (this.judge !== 0) {
            this.judgelabel = this.judgeList.find(
              (item) => item.value === this.judge
            ).label
          }
          if (this.judge !== 7) {
            if (!this.judgeNum) this.judgeNum = 1
            this.$emit('getData', this.judgelabel, this.judge, this.judgeNum, null)
          } else {
            const range = commit_range_handle(this.judgeRange)
            this.$emit('getData', this.judgelabel, this.judge, range, this.judgeContent)
          }
        }
      }
    }
  },
  created () {
    setTimeout(() => {
      this.init_num = init_range_handle(this.initNum)
      this.judge = this.init_judge
      this.judge_change()
    }, 2100)
  }
  • judgeNum通过v-model和value双向绑定,拿值通过value从父组件拿到,值变化通过Input事件通知父组件数值变化
  • 因为v-model只能绑定一个,init_judge使用监听的方式实现双向绑定
  • judge_change:比较符号变化处理
  • getNum:拿到输入的比较数值,当它为空时提示用户有默认值并将默认值设置为1
  • setData:拿到用户输入的区间并进行处理

组件应用

<cCompare
    :init_judge="init_judge"
     v-model="judgeNum"
    :initNum="init_num"
     @getData="getJudge"
/>

import cCompare from '@/components/c-compare'

components: {
    cCompare 
}

data () {
    return {
        init_num: deepCopy(this.initData.judgeRange),
        init_judge: this.initData.judge,
        judgeNum: this.initData.judgeNum
    }
}
  • import引入——>组件注册——>使用
  • 父——>子传参:initNum初始区间、init_judge初始比较符号、judgeNum双向绑定的比较数值

事件钩子

// 拿到区间
getJudge (label, judge, numRange, content) {
      this.checked = false
      var resObj = {}
      if (this.judgeNum === Infinity || this.judgeNum === 1e30) {
        debugger
        this.Msg = 'Tips:您输入的数值过大o(╥﹏╥)o请重新输入哦~~'
        this.tip_show = true
      } else {
        if (this.tip_show) this.tip_show = false
      }
      if (judge === 7) {
        // range
        resObj.content = content
        resObj.val = {
          judge: 7,
          label: label,
          judgeRange: numRange,
          nolimit: false
        }
      } else {
        // num
        resObj.content =
          this.judgeNum !== null && this.judgeNum !== Infinity && this.judgeNum !== 1e30
            ? label + this.judgeNum
            : ''
        resObj.val = {
          judge: judge,
          label: label,
          judgeNum: this.judgeNum,
          nolimit: false
        }
      }
      this.$emit('getData', resObj, this.attr_name)
    }
  • getJudge :拿到区间

github

完整代码点击这里

<think>嗯,用户想比较Yarn和npm的差异,特别是在包管理工具方面的不同。首先,我需要确认用户是不是打错了“yran”,应该是“Yarn”对吧?不过用户后面提到了正确的名称,可能只是输入错误。接下来,我需要回忆Yarn和npm的主要区别。 记得Yarn是由Facebook开发的,为了弥补npm早期版本的不足,比如安装速度慢和依赖管理的问题。而npm是Node.js的默认包管理器,现在也有不少改进。需要从几个方面比较:安装机制、速度、锁文件、输出信息、安全性、工作区功能、CLI体验、网络请求策略、全局包管理、兼容性。 安装机制方面,Yarn是并行安装,而npm早期是顺序安装,现在可能有所改进。速度的话,Yarn通常更快,但npm后续版本可能优化了。锁文件,Yarn用yarn.lock,npm用package-lock.json,两者都是确保依赖一致性。输出信息,Yarn更简洁,npm更详细,这点用户提供的引用里也提到过。 安全性方面,Yarn默认校验包完整性,npm后来也引入了类似功能。工作区功能两者都有,但Yarn的可能更成熟。CLI命令的区别,比如Yarn的add/remove,npm的install/uninstall。网络请求,Yarn离线优先,npm可能更依赖网络。全局包管理路径设置,用户引用中提到了npm的配置,而Yarn可能继承这些配置。兼容性上,两者都遵循package.json,但锁文件格式不同。 还需要参考用户提供的引用内容。引用1提到npm输出冗长,安装时打印所有依赖;引用2和3涉及Yarn的安装配置,比如设置镜像源和全局路径。这些点都要整合到回答中,尤其是锁文件差异和安装过程中的输出信息。 需要确保回答结构清晰,分点列出差异,并引用相关内容。可能还需要生成相关问题,比如性能对比、迁移方法、使用场景选择等。最后检查是否所有行内公式和独立公式都用了正确的LaTeX格式,但这个问题可能不涉及数学公式,所以可能不需要。不过用户给的示例中有代码块,所以需要用正确的格式展示命令示例。 总结一下,回答需要覆盖安装速度、锁文件、输出信息、安全性、命令差异、网络策略、配置管理等方面,引用提供的资料,并生成相关问题。还要注意使用中文,结构清晰,分点说明。</think>### Yarn 与 npm 的差异对比 Yarn 和 npm 是 JavaScript 生态中主流的包管理工具,以下是核心差异的详细分析: --- #### 1. **安装速度与依赖解析** - **Yarn**: 采用并行安装和离线缓存机制,首次安装依赖时会生成缓存,后续安装直接从本地读取,显著提升速度。此外,Yarn 的依赖解析算法更高效,减少重复操作[^2]。 - **npm**: 早期版本依赖解析为顺序安装,速度较慢。但 npm v5+ 引入了 `package-lock.json` 和缓存优化,速度有所提升,但仍略逊于 Yarn[^1]。 --- #### 2. **锁文件机制** - **Yarn**: 使用 `yarn.lock` 文件,记录依赖的精确版本和子依赖关系,确保跨环境一致性。格式更简洁,直接反映依赖树的结构。 - **npm**: 通过 `package-lock.json` 实现类似功能,但早期版本存在格式冗余问题。npm v7+ 改进了锁文件的可读性和安装算法。 --- #### 3. **输出信息与交互体验** - **Yarn**: 命令行输出简洁,仅显示关键信息(如进度条和摘要),适合追求清晰日志的场景。 ```bash yarn add lodash # 输出简洁,仅显示安装结果 ``` - **npm**: 输出信息较冗长,默认打印所有安装细节(如下载路径、依赖树),适合调试场景。 ```bash npm install lodash # 输出包含详细安装过程 ``` --- #### 4. **安全性与校验** - **Yarn**: 默认通过校验和(checksum)验证每个安装包的完整性,防止恶意篡改。 - **npm**: 在 npm v6+ 中引入类似的安全校验功能,但早期版本依赖信任机制,安全性较弱。 --- #### 5. **工作区(Workspaces)支持** - **Yarn**: 内置包管理功能(Monorepo 支持),通过 `workspaces` 字段统一管理个子项目的依赖。 - **npm**: npm v7+ 才支持 Workspaces,功能相对较新,部分场景需配合第三方工具(如 Lerna)。 --- #### 6. **全局包管理配置** - **npm**: 允许自定义全局包存储路径和缓存目录(需手动配置),例如: ```bash npm config set prefix "D:\node\node_global" npm config set cache "D:\node\node_cache" ``` - **Yarn**: 默认继承 npm 的全局配置路径,但可通过环境变量覆盖[^3]。 --- #### 7. **网络请求策略** - **Yarn**: 默认优先使用离线缓存(可通过 `--offline` 强制离线模式),减少网络请求。 - **npm**: 依赖网络实时查询注册表,离线支持较弱(需提前缓存)。 --- ### 如何选择? - **选 Yarn**:需要快速、一致的依赖安装,或需 Monorepo 支持。 - **选 npm**:与 Node.js 原生集成,或需兼容旧项目。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值