@thtf/vue-autocompletedeprecated

a autocomplete textarea component for Vue

Usage no npm install needed!

<script type="module">
  import thtfVueAutocomplete from 'https://cdn.skypack.dev/@thtf/vue-autocomplete';
</script>

README

自动提示文本组件

依赖

Vue 2.6.10+

安装

npm install @thtf/vue-autocomplete

发布

master 分支提交即可。

快速上手

// 使用组件
<template>
  <div id="app">
    <p>本地测试</p>
    <div style="height: 300px; width: 500px">
      <autocomplete v-model="content" :rules="rulesLocal" @matched="matchedLocal"/>
    </div>
    <p>远程测试</p>
    <div style="height: 300px; width: 500px">
      <autocomplete v-model="content" remote :rules="rules" :options="options" :loading="loading" @matched="matched"/>
    </div>
  </div>
</template>

<script>
  // 安装组件
  import Autocomplete from '@thtf/vue-autocomplete'

  // 引用组件
  export default {
    components: {
      Autocomplete
    },
    data() {
      return {
        content: {
          html: '',
          text: '',
        },
        // 本地相关参数
        rulesLocal: [
          {
            rule: /\[/,
            enterAdd: '&',
            data: [
              {
                label: '指标1',
                value: 'foo1',
                children: [
                  {
                    label: '时点1',
                    value: 'bar1',
                    children: [
                      {label: '计量单位1', value: 'foobar1'},
                    ],
                  },
                  {label: '时点2', value: 'bar2'},
                  {label: '时点3', value: 'bar3'},
                ],
              },
              {label: '指标2', value: 'foo2'},
              {label: '指标3', value: 'foo3'},
            ]
          },
          {
            rule: /{/,
            enterAdd: '&',
            data: [
              {
                label: '指标1',
                value: 'foo1',
                children: [
                  {
                    label: '时点1',
                    value: 'bar1',
                    children: [
                      {label: '计量单位1', value: 'foobar1'},
                      {label: '计量单位2', value: 'foobar2'},
                      {label: '计量单位3', value: 'foobar3'},
                    ],
                  },
                  {label: '时点2', value: 'bar2'},
                  {label: '时点3', value: 'bar3'},
                ],
              },
              {label: '指标2', value: 'foo2'},
              {label: '指标3', value: 'foo3'},
            ],
          },
        ],
        // 远程相关参数
        loading: false,
        options: [],
        rules: [
          {
            rule: /\[/,
            enterAdd: '&',
          },
          {
            rule: /{/,
            enterAdd: '&',
          },
        ],
      };
    },
    methods: {
      // 本地回调事件
      matchedLocal(rule, query, row) {
        // console.log(`rule ${JSON.stringify(rule)}`);
        // console.log(`query ${JSON.stringify(query)}`);
        // console.log(`row ${JSON.stringify(row)}`)
      },
      // -------------------------------------------------
      // 远程回调事件
      matched(rule, query, row) {
        console.log(`rule ${JSON.stringify(rule)}`);
        console.log(`query ${JSON.stringify(query)}`);
        console.log(`row ${JSON.stringify(row)}`);
        if (row) {
          // 调用后台接口获取数据
          this.loading = true;
          // 模拟查询条件。
          // 如果 query 为空,返回指标的相关数据
          // 如果 query 为foox,即指标相关的值,则返回时点的相关数据
          // 如果 query 为 [foox, barx],即指标和时点相关的值,则返回计量单位的相关数据
          let params = null;
          if (query.length === 0) {
            params = 1;
          } else if (query.length === 1) {
            params = 2;
          } else if (query.length === 2) {
            params = 3;
          }

          this.getData(params).then((response) => {
            this.loading = false;
            this.options = response;
          });
        }
      },
      // 模拟后台接口
      getData(params) {
        const mockData = {
          1: [
            {label: '指标1', value: 'foo1'},
            {label: '指标2', value: 'foo2'},
            {label: '指标3', value: 'foo3'},
          ],
          2: [
            {label: '时点1', value: 'bar1'},
            {label: '时点2', value: 'bar2'},
            {label: '时点3', value: 'bar3'},
          ],
          3: [
            {label: '计量单位1', value: 'foobar1'},
            {label: '计量单位2', value: 'foobar2'},
            {label: '计量单位3', value: 'foobar3'},
          ],
        };
        return new Promise((resolve) => {
          setTimeout(() => {
            resolve(mockData[params]);
          }, 100);
        });
      },
    }
  }
</script>

@thtf/vue-autocomplete Attributes

参数 说明 类型 可选值 默认值
rules 匹配规则 array - -
debounce 输入时防抖等待时间 Number - 300
minWidth suggester 最小宽度 string - 180px
remote 是否为远程远程匹配 Boolean - false
loading remote 为 true 时,是否正在从远程获取数据 Boolean - false
options remote 为 true 时,远程获取数据列表 Array - []

rules Attributes

参数 说明 类型 可选值 默认值
rule 匹配规则 正则 - -
enterAdd 选中 item 时 向末尾添加的字符 string - 空格
data 匹配规则成功时,suggester 显示列表,remote 为 true 时无效 array - []

@thtf/vue-autocomplete Methods

方法名 说明 参数
change 触发匹配的方法 -

@thtf/vue-autocomplete Events

方法名 说明 回调参数
matched 匹配成功时触发 匹配规则对应的字符串,匹配内容,规则对象
change 获取内容 文本内容