Vue.js 实例

本章节为大家介绍几个 Vue.js 实例,通过实例练习来巩固学到的知识点。

导航菜单实例

导航菜单

创建一个简单的导航菜单:

  1. <div id="main">
  2. <!-- 激活的菜单样式为 active 类 -->
  3. <!-- 为了阻止链接在点击时跳转,我们使用了 "prevent" 修饰符 (preventDefault 的简称)。 -->
  4. <nav v-bind:class="active" v-on:click.prevent>
  5. <!-- 当菜单上的链接被点击时,我们调用了 makeActive 方法, 该方法在 Vue 实例中创建。 -->
  6. <a href="#" class="home" v-on:click="makeActive('home')">Home</a>
  7. <a href="#" class="projects" v-on:click="makeActive('projects')">Projects</a>
  8. <a href="#" class="services" v-on:click="makeActive('services')">Services</a>
  9. <a href="#" class="contact" v-on:click="makeActive('contact')">Contact</a>
  10. </nav>
  11. <!-- 以下 "active" 变量会根据当前选中的值来自动变换 -->
  12. <p>您选择了 <b>{{active}} 菜单</b></p>
  13. </div>
  14. <script>
  15. // 创建一个新的 Vue 实例
  16. var demo = new Vue({
  17. // DOM 元素,挂载视图模型
  18. el: '#main',
  19. // 定义属性,并设置初始值
  20. data: {
  21. active: 'home'
  22. },
  23. // 点击菜单使用的函数
  24. methods: {
  25. makeActive: function(item){
  26. // 模型改变,视图会自动更新
  27. this.active = item;
  28. }
  29. }
  30. });
  31. </script>

编辑文本实例

文本编辑

点击指定文本编辑内容:

  1. <!-- v-cloak 隐藏未编译的变量,直到 Vue 实例准备就绪。 -->
  2. <!-- 元素点击后 hideTooltp() 方法被调用 -->
  3. <div id="main" v-cloak v-on:click="hideTooltip">
  4. <!-- 这是一个提示框
  5. v-on:click.stop 是一个点击事件处理器,stop 修饰符用于阻止事件传递
  6. v-if 用来判断 show_tooltip 为 true 时才显示 -->
  7. <div class="tooltip" v-on:click.stop v-if="show_tooltip">
  8. <!-- v-model 绑定了文本域的内容
  9. 在文本域内容改变时,对应的变量也会实时改变 -->
  10. <input type="text" v-model="text_content" />
  11. </div>
  12. <!-- 点击后调用 "toggleTooltip" 方法并阻止事件传递 -->
  13. <!-- "text_content" 变量根据文本域内容的变化而变化 -->
  14. <p v-on:click.stop="toggleTooltip">{{text_content}}</p>
  15. </div>
  16. <script>
  17. var demo = new Vue({
  18. el: '#main',
  19. data: {
  20. show_tooltip: false,
  21. text_content: '点我,并编辑内容。'
  22. },
  23. methods: {
  24. hideTooltip: function(){
  25. // 在模型改变时,视图也会自动更新
  26. this.show_tooltip = false;
  27. },
  28. toggleTooltip: function(){
  29. this.show_tooltip = !this.show_tooltip;
  30. }
  31. }
  32. })
  33. </script>

订单列表实例

订单列表

创建一个订单列表,并计算总价:

  1. <form id="main" v-cloak>
  2. <h1>Services</h1>
  3. <ul>
  4. <!-- 循环输出 services 数组, 设置选项点击后的样式 -->
  5. <li v-for="service in services" v-on:click="toggleActive(service)" v-bind:class="{ 'active': service.active}">
  6. <!-- 显示订单中的服务名,价格
  7. Vue.js 定义了货币过滤器,用于格式化价格 -->
  8. {{service.name}} <span>{{service.price | currency}}</span>
  9. </li>
  10. </ul>
  11. <div class="total">
  12. <!-- 计算所有服务的价格,并格式化货币 -->
  13. Total: <span>{{total() | currency}}</span>
  14. </div>
  15. </form>
  16. <script>
  17. // 自定义过滤器 "currency".
  18. Vue.filter('currency', function (value) {
  19. return '$' + value.toFixed(2);
  20. });
  21. var demo = new Vue({
  22. el: '#main',
  23. data: {
  24. // 定义模型属性 the model properties. The view will loop
  25. // 视图将循环输出数组的数据
  26. services: [
  27. {
  28. name: 'Web Development',
  29. price: 300,
  30. active:true
  31. },{
  32. name: 'Design',
  33. price: 400,
  34. active:false
  35. },{
  36. name: 'Integration',
  37. price: 250,
  38. active:false
  39. },{
  40. name: 'Training',
  41. price: 220,
  42. active:false
  43. }
  44. ]
  45. },
  46. methods: {
  47. toggleActive: function(s){
  48. s.active = !s.active;
  49. },
  50. total: function(){
  51. var total = 0;
  52. this.services.forEach(function(s){
  53. if (s.active){
  54. total+= s.price;
  55. }
  56. });
  57. return total;
  58. }
  59. }
  60. });
  61. </script>

搜索页面实例

搜索页面

在输入框输入搜索内容,列表显示配置的列表:

  1. <form id="main" v-cloak>
  2. <div class="bar">
  3. <!-- searchString 模型与文本域创建绑定 -->
  4. <input type="text" v-model="searchString" placeholder="输入搜索内容" />
  5. </div>
  6. <ul>
  7. <!-- 循环输出数据 -->
  8. <li v-for="article in filteredArticles">
  9. <a v-bind:href="article.url"><img v-bind:src="article.image" /></a>
  10. <p>{{article.title}}</p>
  11. </li>
  12. </ul>
  13. </form>
  14. <script>
  15. var demo = new Vue({
  16. el: '#main',
  17. data: {
  18. searchString: "",
  19. // 数据模型,实际环境你可以根据 Ajax 来获取
  20. articles: [
  21. {
  22. "title": "Lua 教程",
  23. "url": "https://www.jishuchi.com/books/lua-lang",
  24. "image": "https://www.jishuchi.com/uploads/icons/141562729774.jpeg"
  25. },
  26. {
  27. "title": "C 教程",
  28. "url": "https://www.jishuchi.com/books/c-lang",
  29. "image": "https://www.jishuchi.com/uploads/icons/181564560527.png"
  30. }
  31. ]
  32. },
  33. computed: {
  34. // 计算数学,匹配搜索
  35. filteredArticles: function () {
  36. var articles_array = this.articles,
  37. searchString = this.searchString;
  38. if(!searchString){
  39. return articles_array;
  40. }
  41. searchString = searchString.trim().toLowerCase();
  42. articles_array = articles_array.filter(function(item){
  43. if(item.title.toLowerCase().indexOf(searchString) !== -1){
  44. return item;
  45. }
  46. })
  47. // 返回过滤后的数据
  48. return articles_array;;
  49. }
  50. }
  51. });
  52. </script>

切换不同布局实例

切换不同布局

点击右上角的按钮来切换不同页面布局:

  1. <form id="main" v-cloak>
  2. <div class="bar">
  3. <!-- 两个按钮用于切换不同的列表布局 -->
  4. <a class="list-icon" v-bind:class="{ 'active': layout == 'list'}" v-on:click="layout = 'list'"></a>
  5. <a class="grid-icon" v-bind:class="{ 'active': layout == 'grid'}" v-on:click="layout = 'grid'"></a>
  6. </div>
  7. <!-- 我们设置了两套布局页面。使用哪套依赖于 "layout" 绑定 -->
  8. <ul v-if="layout == 'grid'" class="grid">
  9. <!-- 使用大图,没有文本 -->
  10. <li v-for="a in articles">
  11. <a v-bind:href="a.url" target="_blank" rel="noopener noreferrer"><img v-bind:src="a.image.large" /></a>
  12. </li>
  13. </ul>
  14. <ul v-if="layout == 'list'" class="list">
  15. <!-- 使用小图及标题 -->
  16. <li v-for="a in articles">
  17. <a v-bind:href="a.url" target="_blank" rel="noopener noreferrer"><img v-bind:src="a.image.small" /></a>
  18. <p>{{a.title}}</p>
  19. </li>
  20. </ul>
  21. </form>
  22. <script>
  23. var demo = new Vue({
  24. el: '#main',
  25. data: {
  26. // 视图模型,可能的值是 "grid" 或 "list"。
  27. layout: 'grid',
  28. articles: [{
  29. "title": "Lua 教程",
  30. "url": "https://www.jishuchi.com/books/lua-lang",
  31. "image": {
  32. "large": "https://www.jishuchi.com/uploads/201908/15b84b07e649f9f2.png",
  33. "small": "https://www.jishuchi.com/uploads/icons/141562729774.jpeg"
  34. }
  35. },
  36. {
  37. "title": "C 教程",
  38. "url": "https://www.jishuchi.com/books/c-lang",
  39. "image": {
  40. "large": "https://www.jishuchi.com/uploads/201907/15b66f650252abea.jpeg",
  41. "small": "https://www.jishuchi.com/uploads/icons/181564560527.png"
  42. }
  43. }]
  44. }
  45. });
  46. </script>