Vue3: Sobre o uso do v-model

Índice

Prefácio:

Lembre-se do uso nativo básico:

Encapsulamento de entrada nativa:

Parâmetros personalizados do v-model:

Encapsulamento secundário de el-input:

Vinculando vários modelos v:

modificador v-model:

Combinação de parâmetros personalizados do v-model e modificadores personalizados:


Prefácio:

        Falando em v-model, você deve estar familiarizado com ele. Como uma gramática clássica do vue, ele nos ajuda a economizar muitas coisas ao escrever projetos. Este artigo se concentra em registrar a vinculação e o uso do v-model em componentes!

Lembre-se do uso nativo básico:

Usando entrada nativa, geralmente escrevemos assim:

<input type="text" v-model="name">

Esta notação é equivalente à seguinte notação:

<input type="text" :value="name" @input="e=> name = e.target.value">
<input type="text" :value="name" @input="name = $event.target.value">

 E quando usamos o método de escrita v-model em um componente, o tempo real de escrita fica assim:

<custom-input :model-value="name" @update:modelValue="newValue=>name = newValue"></custom-input>

Observe que model-value e @update:modelValue não são especificados por mim, mas por vue!

Portanto, se quisermos usá-lo assim, precisamos vincular o valor de entrada dentro do componente ao modelValue.

Quando o tempo de entrada original for acionado, use @update:modelValue para executar o novo valor!

<custom-input v-model="name"></custom-input>

Encapsulamento de entrada nativa:

<template>
	<div>modelValue: <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)"></div>
</template>

<script setup>
	import { defineProps, defineEmits } from "vue"

	const props = defineProps(['modelValue'])
	const emit = defineEmits(['update:modelValue'])
</script>

ou outra forma de escrever:

<template>
	<div>modelValue: <input v-model="value"></div>
</template>

<script setup>
	import {defineProps,defineEmits,computed} from "vue"

	const props = defineProps(['modelValue'])
	const emit = defineEmits(['update:modelValue'])

	const value = computed({
		get() {
			return props.modelValue
		},
		set(value) {
			emit('update:modelValue', value)
		}
	})
</script>

Ambas as formas de escrita estão disponíveis, para que possamos introduzir nossos componentes customizados, usando esta forma de escrita

<template>
	<custom-input v-model="name"></custom-input>
	<div>name:{
   
   {name}}</div>
</template>

<script setup>
    import {ref} from "vue";
	import CustomInput from "./components/custom-input/index.vue";
	
	const name = ref('')
</script>

Parâmetros personalizados do v-model:

Por padrão, todos os componentes usam modelValue como prop e update:modelValue como o evento de atualização correspondente. Às vezes, precisamos alterá-lo!

A regra básica é, o suporte personalizado: xxx, o evento de atualização correspondente: atualização: xxx, o componente se torna v-model: xxx, o seguinte é um exemplo de valor

<template>
	<div>自定义v-model的参数,例:value: <input :value="value" @input="$emit('update:value', $event.target.value)"></div>
</template>

<script setup>
	import {defineProps,defineEmits} from "vue"

	const props = defineProps(['value'])
	const emit = defineEmits(['update:value'])
</script>

Aí a gente usa no componente e fica assim:

<custom-input v-model:value="name"></custom-input>

Então, quando usarmos o componente el-input no element-plus, descobriremos que está escrito assim

Ao usar o componente de entrada em Naive UI ou Ant Design Vue, você descobrirá que está escrito assim

 

Em geral, o elemento-plus usa o padrão, enquanto os outros dois têm parâmetros personalizados para ele, e os parâmetros são valor!

Quanto a outra forma de escrever usando computado, basta editar de acordo com a versão mais básica!

Encapsulamento secundário de el-input:

Ao escrever um projeto normalmente, geralmente escolhemos uma estrutura de interface do usuário adequada para o projeto, seja ele element-plus ou ingênuo, etc., não podemos dizer que podemos escrever um componente de entrada nativo para empacotamento, a menos que sua entrada pareça particularmente estranho. . . Na maioria dos casos, podemos reencapsular os componentes da biblioteca de componentes da interface do usuário e, mais provavelmente, ser um encapsulamento de negócios.

Aqui tomamos el-input como um exemplo. Como mencionado acima, el-input na verdade usa o parâmetro padrão modelValue. Também podemos vê-lo lendo o documento el-input --- el- input ;

 Portanto, quando reencapsulamos el-input, precisamos escrever:

<template>
	<div>
		modelValue:
		<el-input :model-value="modelValue" @input="$emit('update:modelValue',$event)" />
	</div>
</template>

<script setup>
	import {defineProps,defineEmits} from "vue"

	const props = defineProps(['modelValue'])
	const emit = defineEmits(['update:modelValue'])
</script>

Se você estiver usando a biblioteca de componentes Naive UI, precisará usar value e update:value ao reencapsular o componente n-input, e o mesmo vale para outras bibliotecas de componentes!

Vinculando vários modelos v:

Quando escrevemos várias caixas de entrada ou outros componentes de formulário em um componente personalizado, devemos usar vários modelos v no componente. No momento, o modelValue padrão não é suficiente para nós, então um parâmetro v-model personalizado é necessário . É muito simples, é só escrever junto e tá tudo bem!

<template>
	<div>
		modelValue:
		<el-input :model-value="modelValue" @input="$emit('update:modelValue',$event)" />
	</div>
	<div>
		自定义v-model的参数,例:value:
		<el-input :model-value="value" @input="$emit('update:value',$event)" />
	</div>
</template>

<script setup>
	import {defineProps,defineEmits} from "vue"

	const props = defineProps(['modelValue', 'value'])
	const emit = defineEmits(['update:modelValue', 'update:value'])
</script>
<template>
	<custom-el-input v-model="name" v-model:value="desc"></custom-el-input>
	<div>name:{
   
   {name}}</div>
	<div>desc:{
   
   {desc}}</div>


</template>

<script setup>
	import CustomElInput from "./components/custom-el-input/index.vue"
	import {ref} from "vue";
	const name = ref('')
	const desc = ref('')
</script>

modificador v-model:

Em relação aos modificadores do v-model, você sabe que existem alguns modificadores embutidos, como .trim, .number e outros. Às vezes, precisamos de modificadores personalizados, veja o exemplo abaixo!

Há um requisito: quando você digita a palavra "Qianjue" na caixa de entrada, ela se torna ***. Este modificador, decidi chamá-lo de .replace, e o efeito escrito fica assim!

<custom-el-input v-model.replace="name"></custom-el-input>

Então, como escrever dentro do componente?

Antes de mais nada, precisamos escrever o modelValue padrão em props e, em seguida, precisamos adicionar modelModifiers, que também é o padrão, e modelValue é correspondido. Observe que o valor padrão de modelModifiers é um objeto vazio!

<template>
	<div>modelValue:
		<el-input :model-value="modelValue" @input="input" />
	</div>
</template>

<script setup>
	import {defineProps,defineEmits} from "vue";
	const props = defineProps({
		modelValue: String,
		modelModifiers: {default: () => ({})}
	})
	const emit = defineEmits(['update:modelValue'])

	/* 将 千珏 关键字代替为 *** 字 */
	const input = (value) => {
		console.log(props);
	}
</script>

Os adereços de impressão podem ver o seguinte conteúdo,

 Quando usamos v-model.replace no componente, replace é verdadeiro aqui, então podemos prosseguir para a próxima etapa, aqui eu uso o método _replace de lodash: _replace de lodash

	/* 将 千珏 关键字代替为 *** 字 */
	const input = (value) => {
		const replace = props.modelModifiers.replace
		const keyWord = '千珏'
		const replaceWord = '***'
		if (replace) {
			value = _replace(value, keyWord, replaceWord)
		}
		emit('update:modelValue', value)
	}

A exibição da página ficará assim: *** é Qian Jue, hehe!

Combinação de parâmetros personalizados do v-model e modificadores personalizados:

A demanda volta: quando inserimos letras minúsculas, ela muda automaticamente para as letras maiúsculas correspondentes.

Nesse caso, modelValue e modelModifiers não podem mais ser usados, é claro. A regra neste momento é customizarmos um parâmetro xxx, e os modelModifiers correspondentes se tornarão xxxModifiers Aqui, tomando value como exemplo, as props terão dois parâmetros, value e valueModifiers.

<template>
	<div>自定义v-model的参数,例:value:
		<el-input :model-value="value" @input="input" />
	</div>
</template>

<script setup>
	import {defineProps,defineEmits} from "vue";
	import _toUpper from "lodash/toUpper"
	const props = defineProps({
		value: String,
		valueModifiers: {
			default: () => ({})
		}
	})
	const emit = defineEmits(['update:value'])

	/* 将 小写字母 转化为 大写字母 */
	const input = (value) => {
		const toUpper = props.valueModifiers.toUpper
		if (toUpper) {
			value = _toUpper(value)
		}
		emit('update:value', value)
	}
</script>

Componentes usam:

<custom-el-input v-model:value.toUpper="desc"></custom-el-input>

 Neste ponto, como inserimos as letras minúsculas serão convertidas automaticamente para maiúsculas, o que é um sucesso!

Acho que você gosta

Origin blog.csdn.net/qq_42543244/article/details/129164599
Recomendado
Clasificación