Vue3.0入门教程

目录
一、组合API
二、带ref响应式变量
三、带reactive响应式变量
四、computed计算属性
五、watch响应式更改
六、props传值
七、emit回调
八、provide/inject

一、 组合API

通过创建 Vue 组件,我们可以将接口的可重复部分及其功能提取到可重用的代码段中。仅此一项就可以使我们的应用程序在可维护性和灵活性方面走得更远。然而,我们的经验已经证明,光靠这一点可能是不够的,尤其是当你的应用程序变得非常大的时候——想想几百个组件。在处理如此大的应用程序时,共享和重用代码变得尤为重要。
用组件的选项 (data、computed、methods、watch) 组织逻辑在大多数情况下都有效。然而,当我们的组件变得更大时,逻辑关注点的列表也会增长。这可能会导致组件难以阅读和理解,尤其是对于那些一开始就没有编写这些组件的人来说。这种碎片化使得理解和维护复杂组件变得困难。选项的分离掩盖了潜在的逻辑问题。此外,在处理单个逻辑关注点时,我们必须不断地“跳转”相关代码的选项块。
如果我们能够将与同一个逻辑关注点相关的代码配置在一起会更好。而这正是组合式 API 使我们能够做到的。

<template>
 <h2>{{userName}}</h2>
</template>
<script>
export default {
  components: {},
  props: {
  },
  setup(props) {
    let userName = '星星编程';
    return {userName} 
  }
}
</script>

二、 带ref响应式变量

ref 接受参数并返回它包装在具有 value property 的对象中,然后可以使用该 property 访问或更改响应式变量的值。

<template>
 <h2>{{userName}}</h2>
 <input type="text" v-model="userName" />
</template>
<script>
import { ref } from 'vue'
export default {
  setup(props) {
    let userName = ref('星星编程');
    return {userName} 
  }
}
</script>

三、带reactive响应式变量

reactive 返回对象的响应式副本。响应式转换是“深层”的——它影响所有嵌套 property。在基于 ES2015 Proxy 的实现中,返回的 proxy 是不等于原始对象的。建议只使用响应式 proxy,避免依赖原始对象。

<template>
 <h2>姓名:{{userName}}</h2>
 <h2>性别:{{sex}}</h2>
 <h2>职业:{{job}}</h2>
</template>
<script>
import { reactive, toRefs} from 'vue'
export default {
  setup(props) {
    let user  = reactive({
        userName:'星星编程',
        sex:'男',
        job:'前端开发工程师'
    });
    return {
        ...toRefs(user)
    } 
  }
}
</script>

四、computed计算属性

computed使用 getter 函数,并为从 getter 返回的值返回一个不变的响应式 ref 对象。
computed 函数返回一个作为 computed 的第一个参数传递的 getter 类回调的输出的一个只读的响应式引用。为了访问新创建的计算变量的 value,我们需要像使用 ref 一样使用 .value property。

<template>
 <h2>{{tip}}</h2>
</template>
<script>
import { computed } from 'vue'
export default {
  setup(props) {
    let userName = '星星编程';
    let tip = computed(()=>{
         return '欢迎关注' + userName + '微信公众号!' ;
     })
    return {
       tip
    } 
  }
}
</script>

五、watch响应式更改

watch 需要侦听特定的数据源,并在单独的回调函数中执行副作用。默认情况下,它也是惰性的——即回调仅在侦听源发生更改时调用。

<template>
  <h2>count:{{ count }}</h2>
  <button @click="random">随机数</button>
</template>
<script>
import { reactive, toRefs, watch } from "vue";
export default {
  setup() {
    const state = reactive({ count: 0 });
    watch(
      () => state.count,
      (count, prevCount) => {
          console.log(prevCount);
      }
    );
    function random() {
      state["count"] = Math.round(Math.random()*10000) ;
    }
    return { ...toRefs(state), random };
  },
};
</script>

六、props传值

1、父组件通过userName属性将userName传递给子组件DemoComponent。

<template>
 <DemoComponent :userName='userName'></DemoComponent>
</template>
<script>
import DemoComponent from '@src/components/DemoComponent.vue';
export default {
  components:{ DemoComponent },
  setup(props) {
    let userName = '星星编程';
    return {
       userName
    } 
  }
}
</script>

2、子组件DemoComponent接收父组件传递userName参数。

<template>
 <h2>{{userName}}</h2>
</template>
<script>
export default {
  props: {
    userName: String
  },
  setup(props) {
    let userName = props.userName;
    return {
       userName
    } 
  }
}
</script>

七、emit回调

1、父组件实现子组件DemoComponent的callback函数,并将接收到tip参数显示到<h2>标签里。

<template>
<h2>{{userName}}</h2>
 <DemoComponent @callback='showTip'></DemoComponent>
</template>
<script>
import { ref } from 'vue'
import DemoComponent from '@src/components/DemoComponent.vue';
export default {
  components:{ DemoComponent },
  setup(props,content) {
    let userName = ref('星星编程');
    function showTip(tip){
       userName.value = tip;
    }
    return {
       userName,
       callback
    } 
  }
}
</script>

2、子组件DemoComponent通过content.emit实现callback回调。

<template>
 <button @click='done'>emit回调</button>
</template>
<script>
export default {
  props: {
    userName: String
  },
  setup(props,content) {
    function done() {
      content.emit('callback','欢迎关注星星编程微信公众号!')
    }
    return {
        done
    } 
  }
}
</script>

八、provide/inject

provide/inject两者都只能在当前活动实例的 setup() 期间调用。
1、在 setup() 中使用 provide 时,我们首先从 vue 显式导入 provide 方法。这使我们能够调用 provide 时来定义每个 property。
provide 函数允许你通过两个参数定义 property:
property 的 name (<String> 类型)
property 的 value

<template>
<h2>provide/inject</h2>
<DemoComponent></DemoComponent>
</template>
<script>
import { ref,provide } from 'vue'
import DemoComponent from '@src/components/DemoComponent.vue';
export default {
  components:{ DemoComponent },
  setup() {
    let userName = ref('星星编程');
    provide('userName', userName);
  }
}
</script>

2、在 setup() 中使用 inject 时,还需要从 vue 显式导入它。一旦我们这样做了,我们就可以调用它来定义如何将它暴露给我们的组件。
inject 函数有两个参数:
要 inject 的 property 的名称
一个默认的值 (可选)

<template>
  <h2>{{ userName }}</h2>
</template>
<script>
import { inject } from "vue";
export default {
  setup() {
    const userName = inject("userName", "默认名字");
    return {
      userName,
    };
  },
};
</script>

3、provide/inject和props传值、emit回调相比传参更加方便,而且可以跨组件传参。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容