开发者问题收集

如何在 vue 3 中实现可重用的组件输入?

2021-04-13
5537

有人能给我一些关于 vue 3 中可重用组件输入的提示吗?就像在 React 中这样:

比如说,

  1. 在父组件中使用 <Input /> 可重用组件
import { useState } from 'react';
import Input from './component/Input';

function Home() {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');

  const handleSubmit = (e) => {
    e.preventDefault();
    
    console.log(email, password);
  }

  return (
    <form onSubmit={handleSubmit}>
      <Input id="email" labelText="Email" value={email} onChange={e => setEmail(e.target.value)} />
      <Input id="password" labelText="Password" value={password} onChange={e => setPassword(e.target.value)} />
      <button type="submit">Login</button>
    </form>
  );
}
  1. 这里 <Input /> 组件:
export default function Input(props) {
  const { id, labelText, value, onChange } = props;

  return (
    <label htmlFor={id}>{labelText}<label>
    <input id={id} value={value} onChange={onChange}>
  );
}
3个回答

您应该阅读 Vue 3 文档中的 组件基础知识

关键概念:

  • 使用 v-bind 指令(或 : 前缀作为简写)进行数据绑定
  • 使用 v-on 指令(或 @ 前缀作为简写)进行事件绑定处理程序
  • 使用 双花括号 对数据属性进行字符串插值
  • 使用 v-model 指令进行双向数据绑定
  • 使用 props 选项声明属性
  • 使用 ref 创建数据属性,使用 Composition API

Vue 3 中的等效输入组件:

<template>
  <label :for="id">{{ labelText }}</label>
  <input
    :value="modelValue"
    @change="$emit('update:modelValue', $event.target.value)"
    :id="id"
  />
</template>

<script>
export default {
  props: {
    id: String,
    labelText: String,
    modelValue: String,
  },
};
</script>

以及表单:

<template>
  <form @submit="handleSubmit">
    <MyInput id="email" labelText="Email" v-model="email" />
    <MyInput id="password" labelText="Password" v-model="password" />
    <button type="submit">Login</button>
  </form>
</template>

<script>
import MyInput from "@/components/MyInput.vue";
import { ref } from "vue";

export default {
  components: {
    MyInput,
  },
  setup() {
    const email = ref("");
    const password = ref("");

    return {
      email,
      password,
      handleSubmit(e) {
        e.preventDefault()
        console.log("submit", email.value, password.value);
      },
    };
  },
};
</script>

demo

tony19
2021-04-13

2023 更新 使用 Vue 组合 API(推荐方式):

   // MyInput.js
    <template>
    <label :for="id"> {{ label }} </label>
    <input 
       :id="id" 
       :value="modelValue" 
       type="text" 
       @input="$event => emit('update:modelValue',   
       $event.target.value)" :placeholder="placeholder"
     />
    </template>

   <script  setup>
    defineProps(['modelValue', 'label', 'id', 'placeholder'])
    const emit = defineEmits(['update:modelValue'])
   </script>

并且你可以在 Vue 3 组件中像这样使用它:

   <template>
    <Input id="my-id" label="my label" 
        v-model="myInputValue" />
   <template>
   <script setup>
    const myInputValue = ref('')
   </script>
mostafa
2023-11-10

新方法 如何在可重用输入组件中使用带有 defineModel 的 v-model Vue 3.4 ; 有关 Medium 的更多详细信息

// How to define the component (native HTML) 
// components/VInput.vue
<script setup>
const model = defineModel()
</script>

<template>
  <input v-model="model" />
</template>

/* ***** */
// How to use the component (native HTML)
// App.vue
<VInput v-model="userName" />

如果您使用以前版本的 vue.js(较旧),您可以尝试使用 宏 define-models 或使用其他答案中描述的解决方案

Leonid Shvab
2024-02-11