你真的了解vue吗?vue3.0初体验

2020-07-09  本文已影响0人  王一诺Eno

@TOC


镇楼图--杀生丸.jpg

image.png

作者上篇文章已经对ue2.0响应式的一个原理做了比较详细的介绍,但2019年10月5日,尤小右公开了 Vue 3.0 的源代码。源码地址:vue-next,至于vue预版本的优势在github都接下来就让我给各位看官大佬介绍一个这个3.0前的一些内容吧;

vue-next(vue3.0预体验)

由于vue-next并不是最终的版本,目前有一些尤大神在知乎上尤小右 3.0 RFC曝光的一些api尚无包含,就目前版本而言,还是能体验一下未来版本使用;下载好vue-next

npm i 

npm run dev

1. 使用:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
  <div id="app"></div>
  <script src="vue.global.js"></script>
  <script>
    console.log('Vue====',Vue)
    const App = {
        setup() {
          // reactive state
          let count =  Vue.reactive({value:1}) // 知乎上尤大大推荐的是使用 const count = value(0) 但目前这个版本是没有value的 先用reactive做响应
          // computed state
          const plusOne = Vue.computed(() => count.value * 2)
          // method
          const increment = () => {
             count.value++ 

            }
          // watch
          Vue.watch(() => count.value * 2, val => {
            console.log(`value * 2 is ${val}`)
          })
          // lifecycle
          Vue.onMounted(() => {
            console.log(`mounted`)
          })
          // expose bindings on render context
          return {
            count,
            plusOne,
            increment
          }
        },
        template: `
          <div>
            <div>count is {{ count.value }}</div>
            <span>plusOne is {{ plusOne }}</span>
            <button @click="increment">count++</button>
          </div>
        `,
      }
    Vue.createApp().mount(App,app)
  </script>
</body>
</html>

2.vue-next的目录结构

image.png

1 编译时:

2 运行时

3 响应式核心

proxy的优势: Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)。1.相较于Object.defineProperty,proxy可以直接监听对象而非其属性,并返回一个新对象。2.可以直接监听数组的变化;3

3. reactive内部实现

  1. 通过vue3.0的源码及现有的一些文档可知: vue3后
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script src="vue.global.js"></script>
    <script>
        let obj = Vue.reactive({value:1});
        Vue.effect(()=>{
            console.log(obj.value)
        })
        obj.value += 1
    </script>
</body>
</html>

未完待续~ 原来19年写的文章忘记发布了啊

上一篇下一篇

猜你喜欢

热点阅读