zoukankan      html  css  js  c++  java
  • vue笔记

    使用淘宝镜像
    - 地址:http://npm.taobao.org/
    - 安装cnpm:
    shell npm install -g cnpm --registry=https://registry.npm.taobao.org

    搭建vue的开发环境:

    • 必须要安装nodejs
    • 搭建vue的开发环境 ,安装vue的脚手架工具 官方命令行工具
    		npm install --global vue-cli  /   cnpm install --global vue-cli         (此命令只需要执行一次)
    
    • 创建项目 必须cd到对应的一个项目里面
      	vue init webpack vue-demo01
      
      	cd  vue-demo01 
      	
      	cnpm install   /  npm install          如果创建项目的时候没有报错,这一步可以省略。如果报错了  cd到项目里面运行  cnpm install   /  npm install
      	
      	npm run dev
      
      
    
    - 另一种创建项目的方式   (推荐)  ***
    ```	shell	
    		vue init webpack-simple vuedemo02
    
    		cd  vuedemo02
    		
    		cnpm install   /  npm install        
    		
    		npm run dev
    

    现在开始创建一个.vue文件,在src下创建MyApp.vue

    <template>
      <div id="myapp">
        <img src="./assets/logo.png" alt="">
        <h1>{{msg}}</h1>
        <h3>{{obj.name}}</h3>
        <hr>
        <ul>
          <li v-for="item in lists">{{item}}</li>
        </ul>
      </div>
    </template>
    
    <script>
        export default {
            name: "MyApp",
            data() {
                return {
                    msg: 'welcome to myapp',
                    obj:{
                        name:'张三'
                    },
                    lists:['1','2','A','B']
                }
            }
        }
    </script>
    
    <style scoped>
    
    </style>
    

    修改main.js

    import Vue from 'vue'
    import MyApp from './MyApp'
    
    new Vue({
      el: '#app',
      render: h => h(MyApp)
    })
    

    添加删除小案例

    <template>
      <div id="myapp">
        +add:<input v-model="todo" @keydown="addList($event)">
        <h3>正在进行</h3>
        <ul>
          <li v-for="(v,k) in lists3" v-if="!v.checked">
            <input type="checkbox" v-model="v.checked"> {{v.title}} <button @click="delV(k)">-del</button>
          </li>
        </ul>
        <hr>
        <h3>完成</h3>
        <ul>
          <li v-for="(v,k) in lists3" v-if="v.checked">
            <input type="checkbox" v-model="v.checked"> {{v.title}} <button @click="delV(k)">-del</button>
          </li>
        </ul>
        <hr>
      </div>
    </template>
    
    <script>
        export default {
            name: "MyApp",
            data() {
                return {
                    todo:'',
                    lists3:[],
                }
            },
            methods:{
                addList(e){
                    if (e.keyCode===13){
                        this.lists3.push({
                            title:this.todo,
                            checked:false
                        });
                        this.todo = '';
                    }
                },
                delV(key){
                    this.lists3.splice(key,1)//删除lists3的第key个,删除一个
                },
            }
        }
    </script>
    
    <style scoped>
    
    </style>
    

    刷新数据会丢失,接下来我们保存到本地浏览器中

    <template>
      <div id="myapp">
        +add:<input v-model="todo" @keydown="addList($event)">
        <h3>正在进行</h3>
        <ul>
          <li v-for="(v,k) in lists3" v-if="!v.checked">
            <input type="checkbox" v-model="v.checked" @change="addLocalStorage()"> {{v.title}} <button @click="delV(k)">-del</button>
          </li>
        </ul>
        <hr>
        <h3>完成</h3>
        <ul>
          <li v-for="(v,k) in lists3" v-if="v.checked">
            <input type="checkbox" v-model="v.checked" @change="addLocalStorage()"> {{v.title}} <button @click="delV(k)">-del</button>
          </li>
        </ul>
        <hr>
      </div>
    </template>
    
    <script>
        export default {
            name: "MyApp",
            data() {
                return {
                    todo:'',
                    lists3:[],
                }
            },
            methods:{
                addList(e){
                    if (e.keyCode===13){
                        this.lists3.push({
                            title:this.todo,
                            checked:false
                        });
                        this.todo = '';
                        this.addLocalStorage()
                    }
                },
                delV(key){
                    this.lists3.splice(key,1)//删除lists3的第key个,删除一个
                    this.addLocalStorage()
                },
                addLocalStorage(){
                    localStorage.setItem('list',JSON.stringify(this.lists3))
                }
            },
            mounted() {//vue页面刷新就会执行的方法
                var list = JSON.parse(localStorage.getItem('list'));
                if(list){
                    this.lists3 = list;
                }
            }
        }
    </script>
    
    <style scoped>
    
    </style>
    

    接下来考虑对localStorage操作进行封装:
    storage.js:

    // localStorage的操作封装
    // src/model/storage.js
    
    var storage = {
      set(key,value){
        localStorage.setItem(key,JSON.stringify(value))
      },
      get(key){
        return JSON.parse(localStorage.getItem(key))
      },
      remove(key){
        localStorage.removeItem(key)
      }
    };
    
    export default storage
    
    

    引入storage

    
    <script>
        import storage from './model/storage'
        export default {
            name: "MyApp",
            data() {
                return {
                    todo:'',
                    lists3:[],
                }
            },
            methods:{
                addList(e){
                    if (e.keyCode===13){
                        this.lists3.push({
                            title:this.todo,
                            checked:false
                        });
                        this.todo = '';
                        this.addLocalStorage()
                    }
                },
                delV(key){
                    this.lists3.splice(key,1)//删除lists3的第key个,删除一个
                    this.addLocalStorage()
                },
                addLocalStorage(){
                    storage.set('list',this.lists3);
                }
            },
            mounted() {//vue页面刷新就会执行的方法
                var list = storage.get('list');
                if(list){
                    this.lists3 = list;
                }
            }
        }
    </script>
    

    组件的使用

    Home.vue
    ```html

    引入组件
    ```html
    
    <template>
      <div id="myapp">
          <v-home></v-home>
      </div>
    </template>
    
    <script>
        import home from './components/Home'
        export default {
            name: "MyApp",
            components:{
                'v-home':home
            }
        }
    </script>
    
    <style scoped>
      /*scoped 局部作用域*/
    </style>
    

    生命周期实例

    <template>
      <div>
        <h3>home组件</h3>
    
      </div>
    </template>
    
    <script>
        export default {
            name: "home",
            beforeCreate() {
                console.log('实例刚刚被创建1')
            },
            created() {
                console.log('实例已经创建完成2')
            },
            beforeMount() {
                console.log('模板编译之前3')
            },
            mounted() {  //请求数据,操作dom可在这进行
                console.log('模板编译完成4')
            },
            beforeUpdate() {
                console.log('数据更新之前')
            },
            updated() {
                console.log('数据更新完毕')
            },
            beforeDestroy() {//页面销毁前报错数据
                console.log('实例销毁之前')
            },
            destroyed() {
                console.log('实例销毁完成')
            }
        }
    </script>
    
    <style scoped>
    
    </style>
    
    
    <template>
      <div id="myapp">
          <v-home v-if="flag"></v-home>
          {{msg}}
          <button @click="changeMsg()">change</button>
          <br>
          <button @click="flag=!flag">挂载组件/销毁组件</button>
      </div>
    </template>
    
    <script>
        import home from './components/Home'
        export default {
            name: "MyApp",
            data(){
                return{
                    msg:'改变之前',
                    flag:false
                }
            },
            methods:{
                changeMsg(){
                    this.msg = '改变之后'
                }
            },
            components:{
                'v-home':home
            },
            beforeCreate() {
                console.log('实例刚刚被创建1')
            },
            created() {
                console.log('实例已经创建完成2')
            },
            beforeMount() {
                console.log('模板编译之前3')
            },
            mounted() {  //请求数据,操作dom可在这进行
                console.log('模板编译完成4')
            },
            beforeUpdate() {
                console.log('数据更新之前')
            },
            updated() {
                console.log('数据更新完毕')
            },
            beforeDestroy() {//页面销毁前报错数据
                console.log('实例销毁之前')
            },
            destroyed() {
                console.log('实例销毁完成')
            }
        }
    </script>
    
    <style scoped>
      /*scoped 局部作用域*/
    </style>
    

    初始化项目

    vue init webpack vue-demo
    

    ESLint ? N 是否需要 js 语法检测

    进入 cd vue-demo

    执行

    npm install
    

    接下来执行

    npm run dev
    

    ,默认浏览器会自动打开

    打包发布

    npm run build
    
    npm install -g serve
    
    serve dist
    

    基础指令:

    {{}}

    v-one: 只渲染一次

    v-html:解析HTML结构

    v-bind: => 简写 :

    v-if :是惰性的

    v-else

    v-show:是否显示或隐藏,只是通过操作css

    v-for (k,i) (v,k,i) :key

    v-on: => 简写 @

    <!-- 阻止单击事件继续传播 -->
    <a v-on:click.stop="doThis"></a>
    
    <!-- 提交事件不再重载页面 -->
    <form v-on:submit.prevent="onSubmit"></form>
    
    <!-- 修饰符可以串联 -->
    <a v-on:click.stop.prevent="doThat"></a>
    
    <!-- 只有修饰符 -->
    <form v-on:submit.prevent></form>
    
    <!-- 添加事件监听器时使用事件捕获模式 -->
    <!-- 即元素自身触发的事件先在此处理,然后才交由内部元素进行处理 -->
    <div v-on:click.capture="doThis">...</div>
    
    <!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
    <!-- 即事件不是从内部元素触发的 -->
    <div v-on:click.self="doThat">...</div>
    

    变异数组:

    • push()
    • pop()
    • shift()
    • unshift()
    • splice()
    • sort()
    • reverse()
    • concat 数组合并

    数组调用变异方法:example1.items.push({ message: 'Baz' })

    替换数组:

    例如:filter(), concat()slice() 。这些不会改变原始数组,但总是返回一个新数组

    components: 组件

    computed() 计算属性

    methods: 方法

    Class与Style绑定 class="[{}]" 对象中可以接受字符串,数组中接受对象

    data: data函数,初始化数据 data中的a,b,c 获取常用方法: const{ a,b,c} = this

    props:[] 通过 Prop 向子组件传递数据
    调用内建的 [**(emit** 方法]并传入事件的名字,来向父级组件触发一个事件: 使用 `)emit` 的第二个参数来提供这个值:

    <template>
      <div>
        父组件: {{mon}}  <!--子传父-->
        <child @money="getMoney" title="一个小目标"/>
      </div>
    </template>
    
    <script>
      import child from './child'
    
      export default {
        name: "parent",
        data() {
          return {
            mon: "",
          }
        },
        components: {
          child,
        },
        methods: {
          getMoney(data) {   // 子传父
            this.mon = data;
          }
        }
      }
    </script>
    
    <style scoped>
    
    </style>
    
    <template>
      <div>
        子组件:
        {{title}}   <!--父传子-->
        <button @click="sendMoney">点击</button>  <!--子传父-->
      </div>
    </template>
    
    <script>
      export default {
        name: "child",
        data() {
          return {}
        },
        props: ["title"],//父传子
        methods: {
          sendMoney() {   //子传父
            this.$emit("money", "先整一个亿?")
          }
        }
      }
    </script>
    
    <style scoped>
    
    </style>
    

    类型:

    props: {
      title: String,
      likes: Number,
      isPublished: Boolean,
      commentIds: Array,
      author: Object
    }
    
    // 带有默认值的对象
        propE: {
          type: Object,
          // 对象或数组默认值必须从一个工厂函数获取
          default: function () {
            return { message: 'hello' }
          }
        },
    

    加载组件

    <component v-bind:is="currentTabComponent"></component>
    

    keep-alive

    <!-- 失活的组件将会被缓存!-->
    <keep-alive>
      <component v-bind:is="currentTabComponent"></component>
    </keep-alive>
    

    访问根实例:

    在每个 new Vue 实例的子组件中,其根实例可以通过 $root 属性进行访问。例如,在这个根实例中:

    // Vue 根实例
    new Vue({
      data: {
        foo: 1
      },
      computed: {
        bar: function () { /* ... */ }
      },
      methods: {
        baz: function () { /* ... */ }
      }
    })
    

    所有的子组件都可以将这个实例作为一个全局 store 来访问或使用。

    // 获取根组件的数据
    this.$root.foo
    
    // 写入根组件的数据
    this.$root.foo = 2
    
    // 访问根组件的计算属性
    this.$root.bar
    
    // 调用根组件的方法
    this.$root.baz()
    

    访问子组件实例或子元素:

    <base-input ref="usernameInput"></base-input>
    
    this.$refs.usernameInput
    

    插槽:

    <模板1>

    ​ you profile

    </模板1>

    在模板1的会被 you profile替换

    1.基础插槽
    2.具名插槽
    3.编译作用域
    父组件模板的所有东西都会在父级作用域内编译;子组件模板的所有东西都会在子级作用域内编译。
    4.作用域插槽(数据传递)
    在 2.5.0+,slot-scope 不再限制在

  • 相关阅读:
    关于application/x-www-form-urlencoded编码
    socket 状态
    TCP/IP三次握手详解
    一步步优化JVM四:决定Java堆的大小以及内存占用
    编码问题
    git 应用
    父与子继承
    python try except
    python 编码问题
    requests 库使用方法
  • 原文地址:https://www.cnblogs.com/fly-book/p/10362848.html
Copyright © 2011-2022 走看看