1.context 可以拿到属性 插槽 发射的自定义事件
<div id="app">
<lk-box style="width: 200px; height: 200px;
background-color: red;"
>
</lk-box>
</div>
const app=Vue.createApp({
});
app.component('lk-box',{
setup(props,context){
const {attrs,slots,emit}=context;
console.log(attrs.style);
},
template:
//父组件给子组件传递数据 no-props
'<div :style="$attrs.style">我是子组件</div>'
});
app.mount("#app");
2.context的emit父组件向子组件传递数据
<div id="app">
<lk-box style="width: 200px; height: 200px;
background-color: red;"
></lk-box>
</div>
const app=Vue.createApp({
});
app.component('lk-box',{
setup(props,context){
const {attrs,slots,emit}=context;
//拿到插槽里面的html代码(是个数组的形式,因为可能有多个元素)
console.log(slots.default()[0]);
},
template:
//父组件给子组件传递数据 no-props
'<div :style="$attrs.style">我是子组件</div>'
});
app.mount("#app");
3.context的computed属性
setup(props,context){
const{ref,computed}=Vue;
let num1=ref(10);
let num2=computed(()=>{
return num1.value*10;
});
return{
num1,
num2
}
}
});
4.context的computed函数的属性 set//设置值时触发 和 get//浏览器得到值时触发
<script>
const app=Vue.createApp({
setup(props,context){
const{ref,computed}=Vue;
let num1=ref(10);
let num2=computed({
get:()=>{//浏览器得到值时触发
return num1.value*10;
},
set:(res)=>{//设置值时触发
console.log(res)
num1.value=res / 10
}
});
let add=()=>{
num2.value+=10;
}
return{
num1,
num2,
add//可以返回函数
}
}
});
app.mount("#app");
-
用reactive的计算属性的用法
num1.value
要写成num1.count
包括显示{{num1}} ---> {{num1.count}}
-
监听器
const app=Vue.createApp({
setup(props,context){
const {ref,watch}=Vue;
let myBrand=ref('xxx');
let site=ref('xxxxsss');
// 同时监听一个
watch(myBrand,(currentB,preB)=>{
console.log("现在的值"+currentS+"之前的值"+preS);
},{});
// 同时监听两个
watch([myBrand,site],([currentB,preB],[currentS,preS])=>{
console.log("现在的值"+currentS+"之前的值"+preS);
},{});
return{
myBrand
}
}
});
在html中使用:
<div id="app">
<input v-model="myBlind"/>
{{myBlind}}//可以使用这样取值
</div>
7.监听器监听一个属性(不大明白)
const app=Vue.createApp({
setup(props,context){
const {ref,watch,reactive,toRefs}=Vue;
let endObj=reactive({brand:'1',site:'111'});
// 同时监听一个(不大明白为什么是一个函数)
watch(()=>endObj.brand,(current,pre)=>{
console.log('xxxxx');
},{});
let {brand,site}= toRefs(endObj);//解构是解构对象
return{
brand,
site
}
}
});
app.mount("#app");
1.watch 与
watchEffect副作用(没有惰性第一次不会生效 更加抽象(非具体,功能少) 不能访问之前的值)
const app=Vue.createApp({
setup(props,context){
const {ref,watch,reactive,toRefs}=Vue;
let endObj=reactive({brand:'1',site:'111'});
// 同时监听一个
watch(()=>endObj.brand,(current,pre)=>{
console.log('xxxxx');
},{
immedia:true,//是否惰性(是否立刻)
deep:ture//是否深度揭示(就是内部有变化也监听)
});
let {brand,site}= toRefs(endObj);//解构对象
return{
brand,
site
}
}
});
app.mount("#app");
2.watchEffect 可以直接深度监听 不能监听之前的值 全局监听(只要数据有变化)
watchEffect(()=>{
console.log("开始监听");
})
3.provide 数据发射出去,谁要用谁去订阅(直接可以子组件拿到父组件数据 但是不能修改)
一样要引入(但是会修改父组件的数据)
父组件: provide("myvalue",value);
provide("myvalue",readonly(value));//发布
子组件: let value=inject('myvalue');//订阅
4.setup中的计算属性
const {ref,computed}=Vue;
let num1=ref(10);
let num2=computed(()=>{
return num1*10;
});
5.vue3的setup的生命周期(放在setup里面)加个 on
const {onBeforeMount}=Vue;
onBeforeMount(()=>{
console.log("xxxx");
});
6.获取真实dom元素(特殊情况用) 直接定义常量 给某个html传值(与v-model差不多)
ref 一一对应可以获得dom元素
const brand=ref(null);
onMounted(()=>{
console.log(brand.value);
});
return{
brand
}
7.Vue-cli 脚手架
Node.js 安装 npm install -g @vue/cli
更新 npm update -g @vue/cli
查看版本 vue -v
安装yarn npm install -g yarn
文件夹右键打开终端 yarn create @vitejs/app my-name
(工程的名称小心不能驼峰)
安装 yarn
启动并下载对应依赖 yarn dev
8.(面试)为什么要用vue-cli脚手架:快速搭建项目和工具
-
public放一些静态的资源
-
src:gitignore进行项目版本控制 有个app.vue
-
可以建个pages文件夹 放.vue最后会变成 index.html
-
main.js 把数据输出到index.html
-
.Vue 是带有 template script style 标签,就是组件化的思想
-
单页面应用:最终会在1个页面显示(index.html) 不用创建很多页面了,一个页面就可以实现跳转等功能
-
package.json 命令行可以 打包 yarn build 会生成dist文件夹 里面有开发依赖和生成依赖
-
vite:与webpack都是打包工具 可以配置访问端口
9.要把html的元素拆出来给.vue
10.<style scoped>//代表这个样式仅仅能作用与本页面
11.
<template>
<Header/>//在这里定义组件
</template>
<script>
import Header from './components/Head.vue'//引入组件
export default{//es6的语法输出模块
name:"app", //输出到app
data(){
return{ }
},
components:{
Header
}
}
</script>