Açúcar sintático para configuração de script Vue3

açúcar sintático de configuração de script

1. API combinada: setup()

Na série Composition API do Vue 3, uma nova função de configuração é introduzida . É uma opção de componente que é executada antes de o componente ser criado. Uma vez que os props são analisados, ele serve como ponto de entrada da API de composição.
A opção de configuração é uma função que usa props e context , e nós expomos tudo o que a configuração retorna para o restante do componente (propriedades computadas, métodos, ganchos de ciclo de vida, etc.), bem como o modelo do componente.

<script>
// 这是一个基于 TypeScript 的 Vue 组件
import { defineComponent } from 'vue'

export default defineComponent({
  setup(props, context) {
    // 在这里声明数据,或者编写函数并在这里执行它

    return {
      // 需要给 `<template />` 用的数据或函数,在这里 `return` 出去
    }
  },
})

</script>

A nova opção de configuração é executada antes da criação do componente e após a análise das props, que é o ponto de entrada da API combinada.
Observação:
① Você deve evitar usar isso na configuração, porque não encontrará a instância do componente. A chamada para setup acontece antes das propriedades de dados, propriedades calculadas ou métodos serem analisados, então eles não podem > ser acessados ​​em setup.
②Na tag de script adicionada com a configuração, não precisamos declarar e método. Essa forma de escrever irá expor automaticamente todas as variáveis ​​e funções de nível superior ao modelo (template) para uso. Aqui enfatizamos a frase "expor para o modelo não é o mesmo que expor para o mundo
exterior
.
"
Ciclo de vida do componente
Alterações no ciclo de vida do Vue podem ser intuitivamente compreendidas na tabela a seguir:

Ciclo de vida do Vue 2 Ciclo de vida do Vue 3
antes de criar setup -- executado antes da criação do componente
criada setup – executado após a criação do componente
antes de montar onBeforeMount – executado antes do componente ser montado no nó
montado onMounted – executado após a montagem do componente
antes de atualizar onBeforeUpdate – executado antes da atualização do componente
Atualizada onUpdated – Executado após a atualização do componente
antes de destruir onBeforeUnmount – executado antes do componente ser desmontado
destruído onUnmounted – executado após a desmontagem do componente
erro capturado onErrorCaptured – a função de gancho é ativada quando uma exceção de um componente descendente é capturada

O beforeCreate e o created no ciclo de vida do Vue 2 foram substituídos por setup no Vue 3 .

Dois, açúcar sintático de configuração de script

É um novo açúcar sintático para Vue3, na função de configuração. Todas as exportações do módulo ES são consideradas valores expostos ao contexto e são incluídas no objeto de retorno setup(). Em comparação com a forma de escrita anterior, a gramática torna-se mais simples após o uso.
1. Não há necessidade de retornar as propriedades e métodos de registro automático e usá-los diretamente
①. O açúcar sintático da configuração do script não é um novo módulo funcional, apenas simplifica o método de gravação da API de composição anterior (compositionApi) que deve retornar **(return)** e tem melhor desempenho em tempo de execução.
②. Na função de configuração : Todas as exportações do módulo ES são consideradas como valores expostos ao contexto e incluídos no objeto de retorno setup(). Em comparação com a forma de escrita anterior, a gramática torna-se mais simples após o uso.
Você não precisa se preocupar com o custo de aprendizado do açúcar sintático de configuração, é uma simplificação da API combinada e não há novos pontos de conhecimento. Você só precisa entender alguns usos e diferenças sutis, ainda mais fáceis do que escrever setup() antes!
O uso também é muito simples, basta adicionar a palavra-chave setup à tag script

<script setup>
</script>

2. Usando
ref na API principal do componente Expor variáveis ​​para template
ref é a API reativa mais comumente usada , que pode ser usada para definir todos os tipos de dados , incluindo nós e componentes do Node . Retorna um objeto responsivo , todos os valores são obtidos através da propriedade .value .

<template>
    <div>{
   
   {counter}}</div>
</template>
<script setup >
import { ref } from 'vue'

const counter = ref(0);//不用 return ,直接在 templete 中使用

const timer = setInterval(() => {
    counter.value++
}, 1000)

onUnmounted(() => {
    clearInterval(timer);
})
</script>

reativo
retorna um proxy reativo para um objeto.

<script setup>
import { reactive, onUnmounted } from 'vue'

const state = reactive({
    counter: 0
})
// 定时器 每秒都会更新数据
const timer = setInterval(() => {
    state.counter++
}, 1000);

onUnmounted(() => {
    clearInterval(timer);
})
</script>
<template>
    <div>{
   
   {state.counter}}</div>
</template>

O uso de ref também pode atingir nosso 'contador' esperado e, no modelo, o vue o processou, podemos usar o contador diretamente sem escrever counter.value

A relação entre ref e reactive:
ref é uma estrutura **{value:'xxxx'} , value é um objeto reativo** A camada inferior de reactive é Proxy
, a essência de ref também é empacotada com reactive, então também é Proxy , e a essência de ref também é reativa
. ref(obj) é equivalente a reactive({value: obj}) Especifique o nome do componente atual , e ele assumirá automaticamente o nome do arquivo como nome principal, ou seja, não há necessidade de escrever o nome atributo. Exemplo:


<template>
	<Child />
</template>

<script setup>
import Child from '@/components/Child.vue'
</script>

4. Defina as props do componente
defineProps—>[usado para receber as props do componente pai]
especifique o tipo de props atual através de defineProps, e obtenha o
exemplo de objeto props do contexto:

<script setup>
   // defineEmits,defineProps无需导入,直接使用
   const props = defineProps({
      title: String,
   })
</script>
<!-- 或者 -->
<script setup lang="ts"> 
    import { ref,defineProps } from 'vue';
    
    type Props={ 
        msg:string 
    }
    defineProps<Props>(); 
</script>

5. Defina emit
defineEmit—>[transferir eventos de componentes filho para componentes pai] use defineEmit para definir os eventos contidos no componente atual e execute o exemplo de código
de emissão por meio do contexto retornado :

<script setup>
     // defineEmits,defineProps无需导入,直接使用
     const emit = defineEmits(['change','delete'])
</script>

6. API defineExpose
defineExpose —> [componente expõe seus próprios atributos]
método de escrita tradicional, podemos acessar o conteúdo do componente filho através da instância ref no componente pai, mas na configuração do script , esse método não pode ser usado. A configuração é equivalente a um fechamento. Exceto pelo modelo de modelo interno , ninguém pode acessar os dados e métodos internos.
Os componentes da configuração do script não expõem nenhuma propriedade declarada internamente para o exterior por padrão. Se algumas propriedades precisam ser expostas, você pode usar defineExpose
Nota : No momento, descobriu-se que as propriedades e métodos expostos por defineExpose são todos tipos desconhecidos.Se houver um método para corrigir o tipo, adicione-o na área de comentários.
Se precisar expor os dados e métodos na configuração , você precisará usar a API defineExpose . Exemplo:

//子组件
<template>
     {
   
   {msg}}
</template>
<script setup>
import  {ref} from 'vue'
let msg = ref("Child Components");
let num = ref(123);
// defineExpose无需导入,直接使用
defineExpose({
      msg,
     num
})
</script>
//父组件
<template>
    <Child ref="child"  />
</template>
<script setup>
import { ref, onMounted } from 'vue'
import Child from '@/components/Child.vue'

let child = ref(null);
onMounted(() => {
    console.log(child.value.msg); // Child Components
	console.log(child.value.num); // 123
})
</script>

7. Comunicação do componente pai-filho

//父组件
<template>
  <div class="wrapper">
     <Child :page="page"
                @pageFn="pageFn"
                ref="childRef"
     >
    <button @click="doSth1"> defineExpose</button>
  </div>
</template>

<script setup>
import {ref} from 'vue'
import Child from './Child.vue'

const childRef = ref();
const page = ref(1)
const  pageFn = (num) => {
  page.value += num
}
function doSth1() {
  console.log(childRef.value)
  childRef.value.doSth();
}
</script>

<style scoped>
div {
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
}
</style>
//子组件
<template>
  <!--  <p>子</p>-->
  <button @click="butFn">改变page值: {
   
   { page }} </button>
</template>
<script setup>
// defineEmits,defineProps无需导入,直接使用
const props = defineProps({
    page: Number
});//接收父组件传来的值
const emit = defineEmits(["pageFn"]); //定义一个变量来接收父组件传来的方法
const butFn = () => {
   emit('pageFn', props.page)
}
function doSth(){
   console.log(333,'defineExpose');
}
defineExpose({ doSth });
// 获取父组件传递过来的数据
console.log(props.page, "parent value"); // parent value
</script>
<style scoped>
button {
  margin: 20px;
}
</style>

O componente filho recebe os dados passados ​​pelo componente pai por meio de defineProps, o componente filho envia informações para o componente pai por meio do evento de definição defineEmits e usa o componente filho defineExpose para passar o componente pai

Acho que você gosta

Origin blog.csdn.net/renfeideboke/article/details/129127105
Recomendado
Clasificación