vue2、vue3、vue3.2和react16 react16.8的区别

9 篇文章 0 订阅
8 篇文章 0 订阅

vue各个版本和react不同,用表格归类,方便记忆。

说明vue2vue3vue3.2react16类组件react16.8函数组件
1.生命周期1、beforecreate;2、created;3、beforemount;4、mounted;5、beforeupdate;6、updated;7、beforedestroy;8、destroyed;9、activated;10、deactivated;setup代替了前两个beforeCreate、created,setup调用在beforecreate之前。setup() { const count = ref(0); onMounted(() => {}); onUnmounted(() => { }等等);beforeCreate、created、beforeMount、Mounted、beforeUpdate、updated、beforeDestroy、destroy一:constructor、getDerivedstatefromprops、render、didMount;二:prop和state、getDerivedstatefromprops、render、didUpdate三:willunmountuseEffect三种状态,据第二个参数:1.[],2.空 3.return; userState; 4.useMemo则可以看作是componentWillUpdate
2.结构形式生命周期、component等分类import {com***} from vue 《script》 setup(props,context){const { attrs, slots, emit, expose } = context} return{// 想在tempate里面使用需要在setup内return暴露出来,麻烦}; setup 在创建我们的组件实例之前运行,我们将无法访问这三个组件属性data computed methods《script setup》,不用写export default{}、return{}。新增且必须使用 defineProps 、defineEmits API、defineExpose、defineStore;const slots = useSlots(); const attrs = useAttrs()constructor(props){super(props) this.state={} render(){return 《p>{message}Hello, React 《/p>}}} 、《Fragment>《/Fragment> 可以加key,<></>不可以加keyfunction SayHi({ message }) { return 《p>{message}Hello, React《/p>}
3.响应datadata(){}const data = ref({…})、const data = reactive({…})同左state = {count:0};this.setState( state => ({count:state.count+1}))const [value, setValue] = useState(“”)
4.性能优化自带SCU自带SCU自带SCUshouldComponentUpdateReact.memo()、useMemo+useCallback
5.refref绑定子组件1.绑定子组件,获取子组件的方法属性 2.绑定响应式数据 .value1.绑定子组件,获取子组件的方法属性,子组件defineExpose 2.绑定响应式数据 .value 其他ref的API:isRef、toRef、toRefs、triggleRef、customRef 、storeToRefs1.stringRef通过 this.refs.传入的字符串格式获取对应的元素;《h2 ref=“titleRef”>Hello React《/h2>this.refs.titleRef.innerHTML = ‘zepp’ 2.this.titleRef = createRef(); = React.createRef(); this.titleRef.current.innerHTML = ‘zep~’函数式组件是没有实例的,所以无法通过ref获取他们的实例一、const inputRef = useRef(null) inputRef.current 不需要响应render 2.获取子组件的属性方法; 让函数组件拥有ref 二、在父级创建ref:my = createRef();2.在父级引入child之后使用时增加ref 3.在子组件函数的第二个参数是ref 4.使用React.forwarRef()高阶组件 5.接收到的ref作为某个元素的属性值,属性名为ref ;三、useImperativeHandle(ref, () => {return {// … your methods … };}, []);
6.teleport弹窗用弹窗用弹窗用ReactDOM.createPortal同左边
7.传参props、emit、refs、provide&inject(用computed实现响应)、vuex(even-bus、pub-sub、localstorage)setup(props,context){context.attrs,context.emit,context.expose,context.slots} (even-bus、pub-sub、localstorage); return{}defineProps([“width”, “height”])、const emits = defineEmits([‘fun’]); emits(‘gatewayData’, label.value)、defineExpose({state1,play2});(even-bus、pub-sub、localstorage)父传子props、父子互传ref 、跨级或同级context、同级也可以EventBus。props、React.createContext->context.Provider(computed、toRef实现响应数据)->context.Consumer爷孙、(parentcomponent、pub-sub、localstorage)爷孙createContext(…)->context.provide value={{…data}}->useContext、ref、redux (parentcomponent、pub-sub、localstorage)
7.1.父组件操作子组件方法this.$refs[‘xxx’]父组件ref,const input = ref(null);input.value.fun();ref=“input” 子组件setup(props,{expose}){expose({fun,data})}defineExpose({ fun})childRef = React.createRef(); this.childRef.current.sendMessage() ref={this.childRef};或者《Child ref=‘childData’>《/Child> this.refs.childData.run();//拿到子组件中runn方法;二、如果子组件包含HOC,需要用onRef修改thiscomponentDidMount(){this.props.onRef && this.props.onRef(this);}const inputRef = useRef(null); 《child ref={this.inputRef}》 forwardRef(function Counter({ num }, ref) { useImperativeHandle(ref, () => {})})
7.2.子操作父组件emit,propssetup(props, context){ props.name; //通过context下面的emit进行事件传递 context.emit(‘hello’,‘子组件参数:哈哈哈’)}defineProps() 和 defineEmits()、defineExpose();useSlotscreateContext-> context.provider ->useContext;子组件toParent =()=>{ this.props.toParent}《div onClick={this.toParent}》父组件:《Child toParent={this.toParent}》子组件 forwardRef(props, ref) =>{props.toParent()}父组件 《Child toParent={toParent}》
8.watch事件watchwatch默认深度监听,如果不是响应数据才写deep:true、watchEffect(不用指定监听对象、访问不到修改之前的值)同左componentDidUpdate(prevProps, prevState) { if (prevState.name !== this.state.name) { console.log(‘Name changed to:’, this.state.name) } }useEffect(() => { console.log(name: ${data.name});}, [data.name])
9.computedget computed() { return this.props.value }const computed = useMemo(() => handler(value), [value])
10.兄弟组件传值event bus、PubSub.publish()event bus、PubSub.publish()eventbus、PubSub.publish()parent component、EventBus库、PubSub.publish()parent component、EventBus库、PubSub.publish()
11.slotslot、匿名、具名、作用域(父读子参数,子:data=“item” 父 v-slot="data"或者#default=‘data’)在vue2基础增加动态名字插槽 #[name] let name=ref(‘duan’)、setup第二个参数的context.slots、等价attrs同左,useSlots()的返回值与 $slots 和 setup的context.slots 等价,Ts,vue3.3才能用defineSlots()子组件{this.props.children[0]}没有this {props.children[0]}
12.this无,let proxy = getCurrentInstance();proxy.$refs[“test”]同左this,需要bind 1.constructor中this.btnClick = this.btnClick.bind(this)、2.箭头函数btnClickTwo =()=>{console.log( this )} 3.《div onClick={(event) => this.handleClick(“过火”, “上火”, event)} >点我《/div> 4.onClick={this.handleClick1.bind( this )}推荐后两种写法没有
13.innerHtmlv-htmlv-htmlv-html<div dangerouslySetInnerHTML={{ __html: ‘《div》123《/div》’ }} />《div dangerouslySetInnerHTML={{ __html: ‘《div>123《/div>’ }} />
14.根目录render只能有一个vue实例。vue2new Vue({ render: h => h(App)}).$mount(‘#app’);template+render可以有多个vue实例。createApp(App).mount(‘#app’)同左ReactDOM.render(<React.StrictMode>《App /></React.StrictMode>,document.getElementById(“root”)😉; render(){return()}同左
15.ssrnuxtnuxtnuxtnextnext
16.路由应用场景:1.登录token是否存在,if(haveToken===true){next()}else{next(‘/login’)}2.请求数据,成功next(),失败next(‘/404’), 3.做统一的弹框在setup()上面写createRouter(), beforeEach等路由另外创建《script>写beforeRouteEnter等。setup里面写useRouter(),userRouter.push({}),beforeEach等路由,没有路由守卫,高阶组件 进行包裹,或者用react-router-config这个库实现。路由:import { Switch, Route, Redirect,withRouter,Link,NavLink,useParams } from ‘react-router-dom’; params路由上的参数同左
常用路由apinew Vue Router(), 全局4个:1.router.beforeEach 2.router.beforeResolve 3.router.afterEach 4.router.beforeEnter,局部组件用 beforeRouteEnter, beforeRouteUpdate,beforeRouteLeave (to, from, next) { next() // 在beforeCreate前,还不能取到this }import { useRouter } from ‘vue-router’; const router = useRouter(); router.push({ name: ‘user’, params: { userId: ‘123’ }})同左1.路由鉴权:《Route> render={()=>{if(){return 《Dashboard />}else{return 《Redirect to=“/login” />}}}2.《Redirect to=‘/login’>《/Redirect>3.《PrivateRoute path=‘/orderdetail’ component={Orderdetail}>《/PrivateRoute>4.requireAuth5.导航守卫React Router 4.0以下,提供了onEnter和onLeave钩子函数。6.《Switch>《Route path=‘map’ component={Map} onEnter={enterTab.bind(this)} onLeave={leaveTab.bind(this)}>《/Route>《Redirect to=“/404” />《Switch>同左
路由模式选择1.history模式:1.1.通过 history.pushState 使用它做页面跳转不会触发页面刷新。1.2.刷新会丢失,所以需要配置vue.config.js mode=history,服务器也得配置。2.hash模式 2.1有#,2.2 window.onhashchange方法获取新URL中hash值同左同左同左同左
17. useMemocomputeduseMemouseMemoReact.memouseMemo(calculateValue, dependencies)
18.Diff1.同层比较,采用双指针头对尾两端对比的方式;2.全量diff,然后移动节点时通过 splice 进行数组操作1.同层比较,采用双指针头对尾两端对比的方式;2.增量diff;在编译阶段提前标记静态节点,Diff 过程中直接跳过有静态标记的节点,并且使用最长递增子序列算法优化了对比流程,快速 Diff同左1.Fiber链表结构树;2.新增打上标记,增量比较,3.异步操作。4.多节点比较需要2轮,Diff 算法的实现在 reconcileChildrenArray 函数。是递归同层比较,标识差异点保存到 Diff 队列保存,得到 patch 树,再统一操作批量更新 DOM。Diff 总共就是移动、删除、增加三个操作,如果结构发生改变就直接卸载重新创建,如果没有则将节点在新集合中的位置和老集合中的 lastIndex 进行比较是否需要移动,如果遍历过程中发现新集合没有,但老集合有就删除redux、flux
mixin类似Object.assign(),@decorator.缺点:命名冲突,难以维护mixins:[]同左同左早期用PureRenderMixin,后来用HOC(HOC 不会修改传入的组件,也不会使用继承来复制其行为。HOC 是纯函数,没有副作用)同左
19. 常用API一、全局new Vue({render: h => h(App)}).$mount(‘#app’); 、 unmount()app.component() app.directive() app.use() app.mixin() app.provide() app.version() 二、选项式data() props() computed() methods() watch() component() mixin()beforeCreate()…nextTick()同左,一、全局createApp(App) 俩个vue实例的功能要完全独立,相互隔离createSSRApp(App)app.mount() 另增加二、组合式setup() ref() toRef() toRefs() toRaw() shallowRef() triggleRef() isRef() isReadonly() isProxy() isReactive() reactive() readonly() watchEffect()watch()onMounted() onUpdated() onUnmounted() onBeforeMount() onBeforeUpdate() onBeforeUnmount()provide() inject()defineProps, defineEmits、defineExpose、defineStore、withDefaults;const slots = useSlots(); const attrs = useAttrs()constructor、componentDidMount、static getDerivedStateFromProps、shouldComponentUpdate、componentDidUpdate、componentWillUnmountuseState、useReducer、useContext、useEffect、useMemo、useCallback、useImperativeHandle+forwardRef。
20. 状态管理vuexpinia,没有mutation module概念(用defineStore代替),体积更小,对ts支持更友好。异步用async awaitpiniaredux缺点:1,简单逻辑但是代码太长2.新手上手不友好、推荐recoil、mobxrecoil:Atom数据,useRecoilState、useRecoilValue、useSetRecoilState、Selector异步
状态管理概念store.state、action(dispatch)->mutation(commit)、getter(computed)pinia defineStore(‘storeId’, {state: () => { return { counter: 0 } },getters:{},actions:{}}),storeToRefs同左边action(dispatch)-》reducer(state, action)-》store、react-thunk异步redux7.1 redux usereducer方法合集 useselector读取 usedispatch设置
21.rendervue默认优化同左同左通过shouldComponentUpdate这个生命周期方法可以进行控制、类组件可以用PureComponentuseMemo代替SCU,export default React.memo(MyComponent, (prevProps, nextProps) => { // 如果prevProps和nextProps完全相同,则返回true // 否则返回false,组件将重新渲染 return prevProps.name === nextProps.name;});
keep-alivekeep-alive同左同左react-activation同左

1.说明:shouldComponentUpdate和useMemo两个的返回值相反,SCU false跳过渲染,useMemo true跳过渲染
16.8以上,父组件state发生变化,子组件也会变化,这时需要优化:
1.1把发生变化的父组件部分,单独封装成一个组件,这样不会影响父和子。
1.2用memo,const Child = React.memo((props)=>{return{《div》props.name《/div》}})
1.3用usecallback,缓存函数,如果给子组件传参了方法《Child handleClick={handleClick}>,就用 const handleChick = useCallback(()={ setCount(count+1)},[]) // 用缓存函数
1.4用useMemo(vue的computed),缓存对象值,必须return,防止被渲染。和而useCallback缓存的是函数
const test = useMemo(()=>{ return…},[])
1.5 类组件用shouldComponentUpdate

shouldComponentUpdate(nextProps, nextState) {
    // 判断是否需要被渲染,如果需要则返回true,否则返回false
    if (nextProps.b === this.props.b) {
      return false;
    } else {
      return true;
    }
  }

2.useRef可以用来定义变量,这些变量更改之后不会引起页面重新渲染,比如分页获取数据时,存储页码。
useRef也可以用来区分初始渲染还是更新(通过current有没值,具体见示例库里的didOrUpdate.tsx)
在DOM节点上定义ref属性,通过.current就可以获取到该DOM元素
通过forwardRef就可以给函数子组件传入ref属性。
使用useImperativeHandle用于定义暴露给父组件的ref方法

3.vuex和redux的差异

4.类组件和函数式组件区别
4.1react类组件

import React from 'react';
 
class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }
 
  componentDidMount() {
    // 组件挂载后的生命周期函数
  }
 
  componentDidUpdate(prevP函数
  }
 
  componentDidUpdate(prevProps, prevState) {
    // 组件更新后的生命周期函数
  }
 
  componentWillUnmount() {
    // 组件卸载前的生命周期函数
  }
 
  handleClick = () => {
    // 事件处理函数
    this.setState({ count: this.state.count + 1 });
  };
 
  render() {
    // 渲染组件
    return (
      <div>
        <p>{this.state.count}</p>
        <button onClick={this.handleClick}>增加</button>
      </div>
    );
  }
}

4.2react函数式编程

import React, { useState, useEffect } from 'react';
 
function MyComponent() {
  const [count, setCount] = useState(0);
 
  useEffect(() => {
    // 组件挂载后或依赖的props更新后的效果
    return () => {
      // 组件卸载前的清理函数
    };
  }, []); // 依赖数组,控制更新时机
 
  const handleClick = () => {
    setCount(count + 1);
  };
 
  return (
    <div>
      <p>{count}</p>
      <button onClick={handleClick}>增加</button>
    </div>
  );
}

5.react16.8 父调子的方法

import { useState, forwardRef, useImperativeHandle, useRef } from "react";
export default function App() {
  const xiaoji = useRef(null); //这个ref是绑定到子组件的
  const add1 = () => {
    console.log("xiaoji", xiaoji);
    // 调用子组件的加方法
    xiaoji.current.add();
  };
  const add2 = () => {
    // 调用子组件的减方法
    xiaoji.current.sub();
  };
  return (
    <div>
      {/* 绑定的ref,此时无数据,需要通过子组件返回绑定的数据或方法才能有值 */}
      <Counter
        ref={xiaoji}
        num={1}
      ></Counter>
      <button onClick={add1}>+</button>
      <button onClick={add2}>-</button>
    </div>
  );
}

// 子组件需要使用forwardRef进行包裹,接收两个参数,参数一为传来的数据(必填,不然会把ref当成第一个参数),参数二为父组件绑定到子组件的ref值
const Counter = forwardRef(function Counter({ num }, ref) {
  console.log("ref", ref); //传过来的ref
  let [count, setCount] = useState(0); //定义的count值
  function add() {
    //子组件加方法
    setCount((a) => (a += 1));
  }
  function sub() {
    // 子组件减方法
    setCount((a) => (a -= 1));
  }
  // 参数一为组件绑定的ref,参数二为绑定到ref上的数据或方法
  useImperativeHandle(ref, () => {
    return {
      // 将子组件的方法绑定到ref,使父组件能通过ref访问到子组件方法
      add,
      sub,
    };
  });
  return (
    // 把上面整个useImperativeHandle注释掉, 给标签添加ref={ref}就可以通过父组件得到这个标签(因为上面是返回绑定属性或方法的ref,这个是返回绑定标签的ref,两者都是返回ref,不能同时使用)
    <p ref={ref}>
      {/* 显示的内容 */}
      {count}----{num}
    </p>
  );
});
// 以上完成就可以通过父组件对子组件的方法进行调用了,这里就是对count值进行加减的例子

6.常用API
6.1 react 类组件常用API

import {Component} from "react";
import {Button} from "antd";
 
interface IState{
    counter:number
}
export default class Index extends Component <any,any>{
    constructor(props: any, context: any) {
        super(props, context);
        this.state={
            counter:0
        }
        console.log("constructor")
    }
    componentDidMount() {
        console.log("componentDidMount")
    }
    static getDerivedStateFromProps(props: any, state: any) {
        console.log("getDerivedStateFromProps")
        return null
    }
    shouldComponentUpdate(nextProps: Readonly<any>, nextState: Readonly<any>, nextContext: any): boolean {
        console.log("shouldComponentUpdate")
        return nextState.counter!<=5
    }
 
    add=()=>{
        this.setState({
            counter:this.state.counter+1
        })
    }
    componentDidUpdate(prevProps: Readonly<any>, prevState: Readonly<any>, snapshot?: any) {
        console.log("componentDidUpdate")
    }
 
    componentWillUnmount() {
        console.log("componentWillUnmount")
    }
 
    render(){
        console.log("render")
        return(
            <>
                <div>{this.state.counter}</div>
                <Button onClick={this.add}>add</Button></>
        )
    }
}

6.2 react用vue的指令
第三方插件: https://github.com/hkduan2004/react-directive
npm i @dbfu/react-directive

7.vue3 defineProps和withDefault区别

<template>
<h1>{{ msg }}</h1>
</template>
<script setuplang="ts">
// 采⽤ts专有声明,⽆默认值
defineProps<{
    msg: string,
    num?: number
}>()
 
// 采⽤ts专有声明,有默认值
interface Props {
  msg?: string
  labels?: string[]
}
const props =withDefaults(defineProps<Props>(),{
      msg:'hello',
      labels:()=>['one','two']
})
 
// ⾮ts专有声明
defineProps({
    msg: String,
    num:{
        type:Number,
        default:''
    }
})
</script>

在这里插入图片描述

vue2 vue3 vue3.2区别
tv code2&tf spa
tv code2: vue3用defineProps和defineEmits、defineExpose、useSlots和useAttrs)
event 缓存
vue2,vue3:template、vue3加入tree shaking,vite,composition ApI,生命周期都加on,diff算法优化(添加静态标记,最长升序子元素算法,增量diff),dom优化、expose
react:1.jsx,2.webpack,3.constructor,4.mount、update、unmount,
typescript,function编程vue3新增了一个名为setup的入口函数,value, computed, watch, onMounted等方法都需要从外部import。 setup pinia api

说明vue2vue3.0vue3.2
数据结构data()setup(){}<script setup />
变量使用data(){return{}setup(){return{…data}}不需要return 和export default{}
顶级 await 的支持要写async要写async不需要写async,直接await
ref、parentthis.$parentchild组件return expose、emitsref、 defineExpose、defineEmits
父子组件传值props、emitprops、emitdefineProps、defineEmits
slotslot、匿名、具名、作用域(父读子参数,子:data=“item” 父 v-slot="data"或者#default=‘data’)在vue2基础增加动态名字插槽 #[name] let name=ref(‘duan’)、attrsuseSlots(在jsx/tsx中更实用)和useAttrs()
vuexslotslot、attrsuseSlots和useAttrs()
watch事件watchwatch默认深度监听,如果不是响应数据才写deep:true、watchEffect(不用指定监听对象、访问不到修改之前的值)同左
v-memo没有没有有。在v-for中使用v-memo时,确保它们被用在了同一个元素上。v-memo在v-for内部是无效的
component需要注册需要注册不需要注册
vscode插件需要注册veturvolar
第三方插件需要注册需要注册一般在 mounted中初始化(注:1)
thisthisgetCurrentInstance()getCurrentInstance()
路由new VueRouter()createRouter()useRouter()
beforeRouteEnterbeforeRouteEnter放在setup(){}前面。单独建一个script放beforeRouteEnter《script lang=“ts”>import { defineComponent } from “vue”;export default defineComponent({ beforeRouteEnter(to, from, next) { },});《/script>
emitthis.$emitsetup(props,context){context.emit(‘fun name’, var)}import defineEmits from 'vue';const emit = defineEmits([“changeMsg”]);emit(“changeMsg”, “is son”);
v-for v-if优先级v-for 然后v-if先v-if同左
创建new Vue({render: h => h(App)}).$mount(‘#app’); h=createElementlet app = Vue.createApp({}) // 将应用与模板绑定app.mount(‘#app’)合并到attrs
v-modelv-model.trim v-model.lazy v-number除了左边的,增加自定义修饰符v-model.capitalize 输入文字首字母大写const props = defineProps({modelValue: String, modelModifiers: { default: () => ({}) }})const emit = defineEmits([‘update:modelValue’])同左边
listenerthis.$listener合并到attrs合并到attrs
移除的api有$on $once $off filter移除了左边那些移除了左边那些
常用APIvue3常见api一、全局new Vue({render: h => h(App)}).$mount(‘#app’); 、 unmount()app.component() app.directive() app.use() app.mixin() app.provide() app.version() 二、选项式data() props() computed() methods() watch() component() mixin()beforeCreate()…nextTick()同左,i一、全局createApp(App) createSSRApp(App)app.mount() 另增加二、组合式setup() ref() toRef() toRefs() toRaw() shallowRef() triggleRef() isRef() isReadonly() isProxy() isReactive() reactive() readonly() watchEffect()watch()onMounted() onUpdated() onUnmounted() onBeforeMount() onBeforeUpdate() onBeforeUnmount()provide() inject()
性能优化keep-alive、路由懒加载、v-for加key、v-if和v-for不能同时使用,大组件拆分小组件合理运用shallowRef,triggleRef。const state =shallowRef({ count: 1 }) // 不会触发更改 state.value.count = 2; // 会触发更改 state.value = { count: 2 }

指令:
v-html v-text v-show v-if v-for v-on v-model v-slot v-once v-pre v-cloak | 有| 有 |

一、vue2 template

export default {
  name: 'baseData', 
  computed:{},//设置计算属性
  data() {return {} },//定义状态
  methods: {},  //定义事件方法
  watch:{} //设置监听属性
}
</script>

修饰符:
1.1.表单修饰符
v-mode.number v-model.lazy=“value” v-model.trim v-model.custom

1.2.事件修饰符
vue: @click.stop阻止冒泡 @click.capture捕获 @click.prevent阻止默认 @click.once只执行一次
react: e.stopPropagation,onClickCapture
1.3.鼠标修饰符
@click.left @click.right @click.middle

1.4.键盘修饰符
@keyup.enter @keydown.esc等

二、vue3 template,支持option API 和compositionAPI

<template>
  <div>
    <p>{{ text1 }}</p>
    <button @click="myFun1">按钮1</button>
    <p>{{ age }}</p>
    <button @click="myfun2">按钮2</button>
  </div>
</template>
 
<script>
import { ref } from "vue";
 
export default {
  name: "App",
  data() {
    return {
      text1: "option api",
    };
  },
  // setu函数是组合api的入口函数
  setup() {
    let age = ref(20);
    function myfun2() {
      alert("llooppp");
    }
    return { age, myfun2 };
  },
 
  components: {},
 
  methods: {
    myFun1() {
      alert("abcdefg");
    },
  },
};
</script>

也可以让option API引用 compositionAPI里面的内容,需要return出date和methods

<template>
  <div>
    <p>{{ text1 }}</p>
    <button @click="myFun1">按钮1</button>
    <p>{{ age }}</p>
    <button @click="myfun2">按钮2</button>
  </div>
</template>
 
<script>
import { ref } from "vue";
 
export default {
  name: "App",
  data() {
    return {
      text1:  1,
    };
  },
  // setu函数是组合api的入口函数
  setup() {
    console.log("setUp函数被执行", this);
    let age = ref(20);
    function myfun2() {
        age.value+=1
    }
    return { age, myfun2 };
  },
  data: () => ({ counter: null }),
  beforeCreate() {
    console.log("beforeCreate被执行", this);
  },
  created() {
    console.log("Create被执行", this);
  },
  components: {},
 
  methods: {
    reset() {
      this.age+=1
      this.text1 +=2
    },
  },
  expose: ['reset']
};
</script>

vue3.0和vue3.2区别
vue3.0暴露变量必须 return 出来,template中才能使用

<script>
import Foo from './Foo.vue'
import Bar from './Bar.vue'
export default {
  setup (props) {
  	console.log(props)
  	return {
  	  ok: Math.random(),
  	  Foo,
  	  Bar
  	}
  }
}
</script>

vue3.2在 script 标签上加上 setup 属性,组件在编译的过程中代码运行的上下是 setup() 函数中。所有ES模块导出都被认为是暴露给上下文的值,并包含在 setup() 返回对象中。

<template> 
	<button @click="color = color === 'red' ? 'green' : 'red'"> Color is: {{ color }} </button>
</template>
 
<script setup>
import { ref } from 'vue'
export const color = ref('red')
</script>
 
<style scoped>
	button { color: v-bind(color);}
</style>

https://juejin.cn/post/7241374490490552376

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端段

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值