vue 一个组件,两种获取值的方式,既可以手动输入,又可以下拉选择值

img

我需要在vue页面中写一个如图这样的,既可以手动输入值又可以从下拉中选择值的组件,

参考下面代码:

<template>
  <div class="input-with-dropdown">
    <input v-model="inputValue" type="text" placeholder="请输入" />
    <button @click="toggleDropdown">下拉</button>
    <ul v-show="showDropdown">
      <li v-for="option in dropdownOptions" :key="option" @click="selectOption(option)">{{ option }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputValue: '', // 输入框的值
      showDropdown: false, // 是否显示下拉框
      dropdownOptions: ['选项1', '选项2', '选项3'] // 下拉框选项
    };
  },
  methods: {
    toggleDropdown() {
      this.showDropdown = !this.showDropdown;
    },
    selectOption(option) {
      this.inputValue += option;
      this.showDropdown = false;
    }
  }
};
</script>

<style>
.input-with-dropdown {
  position: relative;
  display: inline-block;
}

ul {
  position: absolute;
  top: 100%;
  left: 0;
  width: 100%;
  padding: 0;
  margin: 0;
  background-color: #fff;
  list-style-type: none;
  border: 1px solid #ccc;
}

li {
  padding: 8px;
  cursor: pointer;
}

li:hover {
  background-color: #f0f0f0;
}
</style>

```javascript



```

TechWhizKid参考GPT回答:

<template>
  <div>
    <input type="text" v-model="inputValue" />
    <select v-model="selectedValue" @change="handleChange">
      <option v-for="option in options" :key="option.value" :value="option.value">
        {{ option.text }}
      </option>
    </select>
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputValue: '',
      selectedValue: null,
      options: [
        { text: '选择1', value: '1' },
        { text: '选择2', value: '2' },
        // 添加更多的选项
      ],
    };
  },
  methods: {
    handleChange() {
      this.inputValue = this.selectedValue;
    },
  },
  watch: {
    inputValue(newVal) {
      if (this.options.map(o => o.value).includes(newVal)) {
        this.selectedValue = newVal;
      }
    },
  },
};
</script>



这个组件中,当用户在下拉列表中选择一个选项时,该选项的值将被设置为输入框的值。同时,如果用户在输入框中输入一个存在于下拉列表中的值,那么下拉列表的选项也会被相应的更新。需要注意的是,输入框的值和下拉列表的值都是字符串类型的,所以你需要根据你的实际需求进行修改。

另外,你可能需要根据你的具体需求来调整这个组件的样式和行为。

用的 vue 几

有帮助采纳一下哎呦

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7409353
  • 这篇博客你也可以参考下:写一个简单的 Vue 页面,实现选择框选中时,下拉选择框禁用的功能
  • 除此之外, 这篇博客: vue实现用户注册获取验证码及验证码校验功能(部分代码)中的 一个简单的用户手机号绑定/注册的业务大致就是这些,接下来我们开始做。首先做前端,基本框架搭建: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. 先搭框架

    在这里插入图片描述

    1. 搭建vue部分代码

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    其中:

    • phone(TEL)方法用户校验手机号码格式的正则表达式;
    • check方法校验输入框用户提交页面产生的所有可能发生的情况校验;
    • getCode方法集成发送验证码能力sendMsg()获取表单中用户的手机号,带入后台进行业务逻辑处理。getCode()中使用了计时器- setInterval(),实现每隔60秒后用户才可以点击发送短信验证码功能,(该方法做的还不够完善,就是当用户关闭页面之后再打开页面,计时器应该存在,可以考虑存入cookie中或localstroage中)
  • 您还可以看一下 尹涛老师的VUE实战项目之喵喵电影课程中的 第023集:电影详情页组件开发(下)小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以给你提供一种解决方案:

    首先,在Vue页面中创建一个组件可以使用Vue组件的方式进行创建,具体可以参考Vue官方文档:https://cn.vuejs.org/v2/guide/components.html

    接着,实现同时支持手动输入和下拉选择的功能可以使用element-ui中的el-select组件,该组件支持搜索和异步加载,具体可以参考官方文档:https://element.eleme.cn/#/zh-CN/component/select

    对于下拉框的数据源,可以在组件中定义一个属性,等待父组件传递数据源,在组件中通过v-for遍历数据并展示。

    将选择的值传递给父组件可以通过在el-select组件上绑定v-model实现双向数据绑定,并在选中值变化时触发父组件的回调函数。

    对于手动输入的值,可以在el-select组件中添加一个搜索框,并在输入框输入监听器中实时监测用户输入,当输入值不在下拉选项中时,可以弹出一个提示框,告知用户输入的值不合法。

    具体代码可以参考下方:

    <template>
      <div>
        <el-select v-model="selectedValue" filterable @change="handleChange" style="width: 200px;" placeholder="请选择">
          <el-option
            v-for="item in options"
            :key="item.value"
            :label="item.label"
            :value="item.value">
          </el-option>
        </el-select>
      </div>
    </template>
    
    <script>
      export default {
        name: 'MySelect',
        props: {
          options: Array,  // 数据源
          value: [String, Number]  // v-model绑定的值
        },
        data() {
          return {
            selectedValue: this.value  // 选中的值,默认为v-model绑定的值
          }
        },
        watch: {
          value(val) {
            this.selectedValue = val  // 监听v-model的值变化并同步到选中的值
          }
        },
        methods: {
          handleChange(val) {
            this.$emit('input', val)  // 触发父组件的回调函数
          }
        }
      }
    </script>
    

    使用该组件:

    <template>
      <div>
        <my-select :options="options" v-model="selectedValue" @input="handleInput"></my-select>
      </div>
    </template>
    
    <script>
      import MySelect from '@/components/MySelect'
    
      export default {
        name: 'MyPage',
        components: {
          MySelect
        },
        data() {
          return {
            options: [{label: '选项1', value: 1}, {label: '选项2', value: 2}],  // 数据源
            selectedValue: '',  // 初始化选中值为空
          }
        },
        methods: {
          handleInput(val) {
            if (!this.options.find(item => item.value === val)) {
              this.$message.error('输入值不合法!')  // 提示输入值不合法
            } else {
              console.log('选中的值:', val)  // 处理选中的值
            }
          }
        }
      }
    </script>
    

直接用element的选择框select,这个还可以进行远程搜索,不懂的可以问我,我对这个组件库还算熟悉
https://element.eleme.cn/#/zh-CN/component/select

img

img

Vue element中select下拉框支持手输搜索也支持下拉选择

<el-select v-model="table.queryParams.prequalificationUserId" 
placeholder="请选择预审员" clearable 
filterable
@blur="selectBlur"
@clear="selectClear"
@change="selectChange">
<el-option v-for="item in prequalificationList" :key="item.id" :label="item.name"
           :value="item.id"></el-option>
</el-select>


selectBlur(e) {
// 意见类型
 if (e.target.value !== '') {
   this.value = e.target.value;
   this.$forceUpdate()   // 强制更新
 }
},
selectClear() {
 this.value = ''
 this.$forceUpdate()
},
selectChange(val) {
 this.value = val
 this.$forceUpdate()
},


this.$forceUpdate()


源于chatGPT仅供参考


在Vue中,你可以使用`v-model`指令来实现一个组件同时支持手动输入和下拉选择值的功能。你可以为组件添加一个用于接收用户输入的文本框,并使用`v-model`将其与一个数据属性进行双向绑定。然后,可以使用一个下拉选择框来提供预定义的选项,并通过监听下拉框的变化事件来给数据属性赋值。

以下是一个示例代码:

```vue
<template>
  <div>
    <!-- 手动输入 -->
    <input type="text" v-model="selectedValue" />

    <!-- 下拉选择 -->
    <select @change="handleChange">
      <option disabled selected value="">请选择</option>
      <option v-for="option in options" :value="option">{{ option }}</option>
    </select>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedValue: '',
      options: ['选项1', '选项2', '选项3'], // 预定义的选项
    };
  },
  methods: {
    handleChange(event) {
      this.selectedValue = event.target.value;
    },
  },
};
</script>

在上述代码中,selectedValue是用于存储用户选择或手动输入的值的数据属性。v-model指令将文本框与selectedValue进行了双向绑定,使得当用户手动输入时,selectedValue会自动更新。而在下拉选择框中,通过监听@change事件,将选中的值赋给selectedValue,从而实现了手动输入和下拉选择两种方式获取值的功能。

你可以根据实际情况修改选项的内容和数据属性的命名,以满足你的需求。

```

基于new bing的编写:
以下是一个完整的Vue组件,实现了手动输入和下拉选择两种方式来获取用户输入值的功能:

<template>
  <div>
    <select v-model="selectedValue">
      <option v-for="(option, index) in options" :key="index" :value="option.value">{{ option.label }}</option>
    </select>
    <input v-model="selectedValue" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedValue: '',
      options: [
        { label: '选项1', value: 'option1' },
        { label: '选项2', value: 'option2' },
        { label: '选项3', value: 'option3' }
      ]
    };
  }
};
</script>



在上述代码中,我们使用了v-for指令来循环渲染选项列表,使用了:value绑定option.value作为选项的值,使用了:key来标识每个选项,可以提高渲染性能。同时使用了v-model指令将用户选择的值或手动输入的值绑定到selectedValue变量上。

您可以在Vue应用中导入上述组件并在需要添加该组件的地方使用,例如:

<template>
  <div>
    <label>选择或输入值:</label>
    <custom-input />
  </div>
</template>

<script>
import CustomInput from '@/components/CustomInput.vue';

export default {
  components: {
    CustomInput,
  }
};
</script>



标签会被渲染成上述的组件,并且用户可以通过该组件选择或手动输入值。