1. Vue组件的注册与挂载流程

组件是可重复的Vue实例.组件分全局组件和局部组件.

  • 全局组件: 使用Vue.component创建是全局注册的. 它们在注册之后可以用在任何新创建的 Vue 根实例 (new Vue) 的模板中

  1. <body>
  2. <div class="root">
  3. <!-- 调用全局组件 -->
  4. <my-button></my-button>
  5. </div>
  6. <div class="app">
  7. <!-- 调用全局组件 -->
  8. <my-button></my-button>
  9. </div>
  10. <script>
  11. // 定义一个全局组件
  12. Vue.component('my-button', {
  13. template: `<Button type="">{{name}}</Button>`,
  14. data() {
  15. return {
  16. name: "php.cn"
  17. }
  18. },
  19. });
  20. new Vue({
  21. el: '.root',
  22. });
  23. new Vue({
  24. el: '.app',
  25. });
  26. </script>
  27. </body>
  • 局部组件: 通过Vue实例components选项定义的组件是局部注册的.局部组件只可在创建它的实例中使用. 其它实例中无效.

  1. <body>
  2. <div class="app1">
  3. <my-tag :my-name="msg"></my-tag>
  4. </div>
  5. <hr>
  6. <div class="app2">
  7. <my-tag :my-name="msg"></my-tag>
  8. </div>
  9. <script>
  10. new Vue({
  11. el: '.app1',
  12. data() {
  13. return {
  14. msg: '这是一个app1局部组件',
  15. }
  16. },
  17. components: {
  18. myTag: {
  19. props: ['myName'],
  20. template: `<p>{{myName}}</p>`,
  21. }
  22. }
  23. })
  24. new Vue({
  25. el: '.app2',
  26. data() {
  27. return {
  28. msg: '这是一个app2局部组件',
  29. }
  30. },
  31. })
  32. </script>
  33. </body>
组件注册的几种方法
  • 在Vue实例内部
  • 通过创建一个变量
  • 通过template标签,通过id引用
  1. <body>
  2. <div class="app1">
  3. <my-tag></my-tag>
  4. <hr>
  5. <my-btn></my-btn>
  6. <hr>
  7. <my-table></my-table>
  8. </div>
  9. <template id="myTable">
  10. <div>
  11. {{tableName}}
  12. </div>
  13. </template>
  14. <script>
  15. // 创建一个对象
  16. const btn = {
  17. template: `<Button type="text">{{btnName}}</Button>`,
  18. data() {
  19. return {
  20. btnName: '变量创建'
  21. }
  22. },
  23. };
  24. new Vue({
  25. el: '.app1',
  26. components: {
  27. // 直接内部创建
  28. myTag: {
  29. data() {
  30. return {
  31. myName: '实例内部创建'
  32. }
  33. },
  34. template: `<p>{{myName}}</p>`,
  35. },
  36. // 调用对象
  37. myBtn: btn,
  38. // 使用template标签
  39. myTable: {
  40. data() {
  41. return {
  42. tableName: 'template标签创建'
  43. }
  44. },
  45. template: '#myTable',
  46. }
  47. }
  48. })
  49. </script>
  50. </body>

组件间的通信

  • 父组件向子组件, 子组件通过props属性,props是一个数组.
  1. <body>
  2. <div class="app">
  3. <!-- 父组件把user变量绑定到user2属性上 -->
  4. <user-list v-for="(user, index) in users" :key="index" :user2="user"></user-list>
  5. </div>
  6. <script>
  7. new Vue({
  8. el: '.app',
  9. data() {
  10. return {
  11. users: [
  12. { id: 1, name: '张三', email: 'zs@qq.com' },
  13. { id: 2, name: '李四', email: 'ls@qq.com' },
  14. { id: 3, name: '王五', email: 'ww@qq.com' },
  15. ]
  16. }
  17. },
  18. components: {
  19. userList: {
  20. // 通过props获得父组件的user2属性
  21. props: ['user2'],
  22. template: `<li>{{user2.name}},{{user2.email}}</li>`,
  23. }
  24. }
  25. })
  26. </script>
  27. </body>
  • 子组件向父组件, 子组件通过$emit - $emit(‘父组件自定义方法’,附加参数) 方法来触发父组件的一个事件

  1. <body>
  2. <div class="app">
  3. <!-- 父组件自定义方法btn,btn绑定函数mySum -->
  4. <my-vol :name='name' :count='count' @btn='mySum'></my-vol>
  5. </div>
  6. <script>
  7. new Vue({
  8. el: '.app',
  9. data() {
  10. return {
  11. name: "php中文网",
  12. count: 0,
  13. }
  14. },
  15. components: {
  16. myVol: {
  17. props: ['name', 'count'],
  18. template: `
  19. <div>
  20. <p>{{name}}</p>
  21. <!--通过$emit引用父组件的btn方法,可传参1-->
  22. <button @click="$emit('btn',1)">{{count}}</button>
  23. </div>
  24. `,
  25. }
  26. },
  27. methods: {
  28. mySum: function ($event) {
  29. this.count += $event;
  30. console.log(this.count);
  31. }
  32. },
  33. })
  34. </script>
  35. </body>

2. 路由原理与注册流程

通过改变 URL,在不重新请求页面的情况下,更新页面视图
Vue的路由实现:hash模式 和 history模式
1)hash模式的实现原理
location.hash 的值就是 URL 中 # 后面的内容。
URL 中 hash 值只是客户端的一种状态,也就是说当向服务器端发出请求时,hash 部分不会被发送;
hash 值的改变,都会在浏览器的访问历史中增加一个记录。因此我们能通过浏览器的回退、前进按钮控制hash 的切换;
可以通过 a 标签,并设置 href 属性,当用户点击这个标签后,URL 的 hash 值会发生改变;或者使用 JavaScript 来对 loaction.hash 进行赋值,改变 URL 的 hash 值;
我们可以使用 hashchange 事件来监听 hash 值的变化,从而对页面进行跳转(渲染)。
2)history模式的实现原理
HTML5 提供了 History API 来实现 URL 的变化。其中做最主要的 API 有以下两个:history.pushState() 和 history.repalceState()。这两个 API 可以在不进行刷新的情况下,操作浏览器的历史纪录。唯一不同的是,前者是新增一个历史记录,后者是直接替换当前的历史记录。
pushState 和 repalceState 两个 API 来操作实现 URL 的变化 ;
我们可以使用 popstate 事件来监听 url 的变化,从而对页面进行跳转(渲染);
history.pushState() 或 history.replaceState() 不会触发 popstate 事件,这时我们需要手动触发页面跳转(渲染)。


  • html
  1. <div class="root">
  2. <!-- 使用 router-link 组件来导航. -->
  3. <!-- 通过传入 `to` 属性指定链接. -->
  4. <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
  5. <router-link to="/news">新闻</router-link>
  6. <router-link to="/articles">软件</router-link>
  7. <!-- 路由出口 -->
  8. <!-- 路由匹配到的组件将渲染在这里 -->
  9. <router-view></router-view>
  10. </div>
  • js
  1. // 定义组件
  2. let news = {
  3. template: `
  4. <div>
  5. <dl><dd style="display: block;width: 100%; overflow: hidden;"><a href="/toutiao-409221.html" target="_blank" title="php中文网原创视频:《天龙八部》公益php培训系列课程汇总!" style="white-space:nowrap">php中文网原创视频:《天龙八部》公益php培训系列课程汇总!</a></dd>
  6. <dd style="display: block;width: 100%; overflow: hidden;"><a href="/toutiao-409169.html" target="_blank" title="php中文网《玉女心经》公益PHP WEB培训系列课程汇总" style="white-space:nowrap">php中文网《玉女心经》公益PHP WEB培训系列课程汇总</a></dd></dl>
  7. </div>
  8. `,
  9. }
  10. let articles = {
  11. template: `
  12. <ul><li><span>03-02</span><a title="phpStudio集成环境(支持php8,php中文网学习专用)" href="/xiazai/gongju/1532" target="_blank">phpStudio集成环境(支持php8php中文网学习专用)</a></li>
  13. <li><span>01-17</span><a title="小皮面板(phpStudy for Linux 服务器运维管理面板)" href="/xiazai/gongju/1528" target="_blank">小皮面板(phpStudy for Linux 服务器运维管理面板)</a></li>
  14. <li><span>01-16</span><a title="VSCode Windows 64位 下载" href="/xiazai/gongju/1527" target="_blank">VSCode Windows 64位 下载</a></li><li><span>10-26</span><a title="Memcached Win64位系统 1.4.4版本" href="/xiazai/gongju/1525" target="_blank">Memcached Win64位系统 1.4.4版本</a></li></ul>
  15. `,
  16. }
  17. // 创建路由实例
  18. let router = new VueRouter({
  19. routes: [
  20. { path: '/news', component: news },
  21. { path: '/articles', component: articles }
  22. ]
  23. })
  24. // 创建Vue实例 挂载路由
  25. new Vue({
  26. el: '.root',
  27. router: router,
  28. })

更多相关文章

  1. Vue:1.Vue组件的注册与挂载流程,实例演示; 2. 路由原理与注册流程
  2. Spring小记
  3. Vue:实例演示,v-if,v-for,v-model,v-bind,v-on,计算属性和侦听器
  4. Vue组件的注册与挂载流程; 路由原理与注册流程 ----0416
  5. 1. 实例演示Ajax的get,post请求; 2. 练习选顶卡和换肤案例
  6. Kubernetes 指标采集组件的部署
  7. jQuery:常用dom和事件操作,jQuery中的$.ajax方法,Vue基本术语与
  8. 为留言板添加字数实时统计与禁止超出功能; 2. 自选一些字符串和
  9. 【Vue框架学习】组件注册、组件通信、前端路由实现原理等知识点

随机推荐

  1. 安装完android studio,启动时碰到"failed
  2. [置顶] Android中对Log日志文件的分析
  3. Android 资源(resource)学习小结
  4. ANDROID: NDK编程入门笔记
  5. 想看看Android L的效果,结果导致Eclispe无
  6. android:gravity="start" Android 多行文
  7. ANDROID音频系统散记之一:A2dpAudioInterf
  8. android 每周学习笔记及总结(每周更新)
  9. Android 中 WebView 使用漏洞相关介绍
  10. Dagger 2 在 Android 上的使用(一)