• eyb:Vue学习2



    目录:

    (1)条件渲染

    (2)列表渲染

    (3)事件处理

    (4)Axios异步通信

    (5)表单输入绑定

    (6)组件基础

    (7)计算属性

    (8)插槽内容

    (9)自定义事件

    (10)Vue-cli搭建

    (11)Vue-cli目录结构

    (12)Webpack简介

    (13)Webpack的安装及使用

    (14)Vue-router


    (1)条件渲染

    学习vue的语法:什么是条件渲染呢?说起来其实就是if-else 

     

     if-else

     双项绑定:

     if- else -if

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    6. <title>条件渲染</title>
    7. </head>
    8. <body>
    9. <div id="app">
    10. <div v-if="type === 'A'">
    11. A
    12. </div>
    13. <div v-else-if="type === 'B'">
    14. B
    15. </div>
    16. <div v-else-if="type === 'C'">
    17. C
    18. </div>
    19. <div v-else>
    20. Not A/B/C
    21. </div>
    22. </div>
    23. <script>
    24. var app = new Vue({
    25. //element的缩写,挂在元素
    26. el: '#app',
    27. data: {
    28. type:'B'
    29. }
    30. })
    31. </script>
    32. </body>
    33. </html>

     双向绑定:

    (2)列表渲染

     列表渲染:说白了就是for循环语句

     

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    6. <title>条件渲染</title>
    7. </head>
    8. <body>
    9. <ul id="example-1">
    10. <li v-for="item in items">
    11. {{ item.message }}
    12. </li>
    13. </ul>
    14. <script>
    15. var example1 = new Vue({
    16. el: '#example-1',
    17. data: {
    18. items: [
    19. { message: 'Foo' },
    20. { message: 'Bar' }
    21. ]
    22. }
    23. })
    24. </script>
    25. </body>
    26. </html>

     

     (3)事件处理

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    6. <title>条件渲染</title>
    7. </head>
    8. <body>
    9. <div id="example-1">
    10. <button v-on:click="greet">Greet</button>
    11. </div>
    12. <script>
    13. var app = new Vue({
    14. //element的缩写,挂在元素
    15. el: '#example-1',
    16. methods:{
    17. greet:function(){
    18. alert("Hello Vue")
    19. }
    20. }
    21. })
    22. </script>
    23. </body>
    24. </html>

     

    可以通过this指向message数据,通过alert显示 

     (4)Axios异步通信

     

     

     {
        "name": "百度",
        "url": "http://www.baidu.com",
        "page": 66,
        "isNonProfit": true,
        "address": {
            "street": "海淀区",
            "city": "北京市",
            "contury": "中国"
        },
        "links": [
            {
                "name": "Google",
                "url": "http://www.google.com"
            },
            {
                "name": "Baidu",
                "url": "http://www.baidu.com"
            }
        ]
        
    }

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <!-- 引入Vue在线CDN -->
    6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    7. <!-- 引入Asiox -->
    8. <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    9. <title>Axios</title>
    10. </head>
    11. <body>
    12. <div id="app">
    13. <div>
    14. 名称:{{info.name}}
    15. </div>
    16. <div>
    17. url:{{info.url}}
    18. url:<a v-bind:href="info.url">{{info.url}}</a>
    19. </div>
    20. <ul>
    21. <li v-for="link in info.links">
    22. {{link.name}}--{{link.url}}
    23. </li>
    24. </ul>
    25. </div>
    26. <script>
    27. var app = new Vue({
    28. //element的缩写,挂在元素
    29. el: '#app',
    30. data() {
    31. return{
    32. info: {
    33. name:'',
    34. url:'',
    35. links:[]
    36. }
    37. }
    38. },
    39. //使用钩子函数 编译好的html挂载到页面完成后执行的事件钩子
    40. mounted(){
    41. //发送Axios请求,支持链式编程
    42. axios
    43. .get('data.json')
    44. .then(response=> this.info=response.data)
    45. }
    46. })
    47. </script>
    48. </body>
    49. </html>

    点击第三行的连接: 

     

     (5)表单输入绑定

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <!-- 引入Vue在线CDN -->
    6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    7. <title>表单输入绑定</title>
    8. </head>
    9. <body>
    10. <div id="app">
    11. <input type="text" v-model="message" value="Hello"/>
    12. <p>Message is:{{message}}</p>
    13. <!-- select里面加multiple就变成多选框-->
    14. <select v-model="selected">
    15. <option disabled value="">Please select one</option>
    16. <option>A</option>
    17. <option>B</option>
    18. <option>C</option>
    19. </select>
    20. <span>Selected:{{selected}}</span>
    21. </div>
    22. <script>
    23. var app = new Vue({
    24. //element的缩写,挂在元素
    25. el: '#app',
    26. data: {
    27. message: 'Hello Vue!',
    28. selected:''
    29. }
    30. })
    31. </script>
    32. </body>
    33. </html>

     

     输入框添加111111

    下拉列表框选择 

     

     (6)组件基础

     

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <!-- 引入Vue在线CDN -->
    6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    7. <title>vue组件</title>
    8. </head>
    9. <body>
    10. <div id="app">
    11. <ul>
    12. <!-- 使用定义的组件 -->
    13. <my-component-li v-for="item in items" v-bind:item="item"></my-component-li>
    14. </ul>
    15. </div>
    16. <script>
    17. //原来js方式定义组件
    18. Vue.component("my-component-li",{
    19. //关联item 使用props
    20. props:["item"],
    21. template:'
    22. {{item}}
    23. '
  • })
  • var app = new Vue({
  • //element的缩写,挂在元素
  • el: '#app',
  • //数据
  • data:{
  • items:["古力娜扎","迪丽热巴","吗尔巴哈"]
  • }
  • })
  • </script>
  • </body>
  • </html>
  •  

    (7)计算属性

    把计算结果缓存起来,变成一个静态的属性,能够避免系统的开销 

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <!-- 引入Vue在线CDN -->
    6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    7. <title>计算属性</title>
    8. </head>
    9. <body>
    10. <div id="app">
    11. <p>当前的时间:{{getcurrentTime()}}</p>
    12. <p>计算属性当前的时间:{{getcurrentTime1}}</p>
    13. </div>
    14. <script>
    15. var app = new Vue({
    16. //element的缩写,挂在元素
    17. el: '#app',
    18. methods:{
    19. getcurrentTime:function(){
    20. return Date.now();
    21. },
    22. },
    23. //计算属性
    24. computed:{
    25. getcurrentTime1:function(){
    26. return Date.now();
    27. }
    28. }
    29. })
    30. </script>
    31. </body>
    32. </html>

    可以看到计算属性的值是不发生改变的: 

     (8)插槽内容

     插槽就是为了给子组件确定一个摆放的位置的,利用插槽把子组件放到指定的位置

     

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <!-- 引入Vue在线CDN -->
    6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    7. <title>插槽</title>
    8. </head>
    9. <body>
    10. <div id="app">
    11. <todo>
    12. <!--v-bind:是绑定下面的data中的信息 v-for循环data中的信息 -->
    13. <todo-title slot="todo-title" v-bind:title="title"></todo-title>
    14. <todo-content slot="todo-content" v-for="item in items" v-bind:item=item></todo-content>
    15. </todo>
    16. </div>
    17. <script>
    18. //js语法定义组件 定义代办组件
    19. Vue.component("todo",{
    20. template:'
      todo-title\'>
        todo-content\'>
      '
    21. });
    22. //定义代子组件 标题组件
    23. Vue.component("todo-title",{
    24. props:['title'],
    25. template:"
      {{title}}
      "
    26. });
    27. //定义代子组件 内容组件
    28. Vue.component("todo-content",{
    29. props:['item'],
    30. template:"
    31. {{item}}
    32. "
  • })
  • var app = new Vue({
  • //element的缩写,挂在元素
  • el: '#app',
  • data: {
  • title: 'Hello Vue1!',
  • items:["古力娜扎","迪丽热巴","巴尔哈扎"]
  • }
  • })
  • </script>
  • </body>
  • </html>
  •  

     (9)自定义事件

    子组件里面的事件是不能访问外面的事件的,通过this.$emit来绑定 

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <!-- 引入Vue在线CDN -->
    6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    7. <title>插槽</title>
    8. </head>
    9. <body>
    10. <div id="app">
    11. <todo>
    12. <todo-title slot="todo-title" v-bind:title="title"></todo-title>
    13. <!-- v-for="(item,index) in items" index是遍历的下标-->
    14. <todo-content slot="todo-content" v-for="(item,index) in items" v-bind:item=item v-bind:index="index" v-on:remove="removeItems"></todo-content>
    15. </todo>
    16. </div>
    17. <script>
    18. //js语法定义组件 定义代办组件
    19. Vue.component("todo",{
    20. template:'
      todo-title\'>
        todo-content\'>
      '
    21. });
    22. //子组件 标题组件
    23. Vue.component("todo-title",{
    24. props:['title'],
    25. template:"
      {{title}}
      "
    26. });
    27. //内容组件
    28. Vue.component("todo-content",{
    29. props:['item','index'],
    30. //v-on:click调用下面methods方法,直接写方法名不用带(),v-on:click可以缩写@click
    31. template:"
    32. {{index}}--{{item}}
    33. ",
  • methods:{
  • remove:function(){
  • this.$emit("remove")
  • }
  • }
  • })
  • var app = new Vue({
  • //element的缩写,挂在元素
  • el: '#app',
  • data: {
  • title: 'Hello Vue1!',
  • items:["古力娜扎","迪丽热巴","巴尔哈扎"]
  • },
  • methods:{
  • removeItems:function(index){
  • this.items.splice(index,1)
  • }
  • }
  • })
  • </script>
  • </body>
  • </html>
  • 点击删除第一个:

     

     (10)Vue-cli搭建

    本地调试:原来是在浏览器里面按F12,进行调试,但是通过vue-cli创建的项目有对应的本地调试

    热部署:以前写完代码需要重新运行编译,然后再去浏览器按F5刷新,才能看到代码效果,有了热部署之后,只要把代码写完,保存一下,它会自动帮助我们编译重新运行,到浏览器端已经帮我们刷新好了,看到效果

    集成打包上线:vue前端用的是原生的js ES6,ES6有许多浏览器不支持,需要打包成ES5,vue-cli集成了打包上线,把webpack集成上去了 

    在创建Vue项目的时候,不用在通过