前端学习之路--vue(二)

  1. 文件目录(cal.js是不小心弄进来的,就当不存在,没啥用)

     

  2. app.vue

    <template>
        <div>我们的第一个vue程序</div>
    </template>
    <script>
        
    </script>
    <style></style>

     

  3. index.html

    <!DOCTYPE html>
    <html>
    <head>
        <title>01_第一个vue程序启动</title>
    </head>
    <body>
        <div class="app">1111111111</div>
    </body>
    </html>

     

  4. main.js

    var Vue = require('vue');
    var App = require('./app.vue');
    
    
    
    new Vue({
        el:'.app',
        render:function(creater){
            return creater(App)
        }
    })

     

  5. package.js

    {
      "name": "02",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "dev":".\\node_modules\\.bin\\webpack-dev-server --inline --hot --open --port 8888",
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "autoprefixer-loader": "^3.2.0",
        "babel-core": "^6.25.0",
        "babel-loader": "^7.1.1",
        "babel-plugin-transform-runtime": "^6.23.0",
        "babel-preset-es2015": "^6.24.1",
        "css-loader": "^0.28.4",
        "file-loader": "^0.11.2",
        "less": "^2.7.2",
        "less-loader": "^4.0.5",
        "style-loader": "^0.18.2",
        "url-loader": "^0.5.9",
        "vue-loader": "^13.0.4",
        "vue-template-compiler": "^2.4.2",
        "webpack": "^3.4.1",
        "webpack-dev-server": "^2.6.1"
      },
      "dependencies": {
        "html-webpack-plugin": "^3.2.0",
        "vue": "^2.4.2"
      }
    }
    

     

  6. webpack.config.js

     const htmlWebpackPlugin = require('html-webpack-plugin');
        const path = require('path')
        module.exports = {
            entry:{ //main是默认入口,也可以是多入口
                main:'./src/main.js'
            },
            //出口
            output:{
                filename:'./build.js', //指定js文件
                path: path.join(__dirname,'dist')          //最好是绝对路径
                //代表当前目录的上一级的dist
            },
            module:{
                //一样的功能rules:   webpack2.x之后新加的
                rules:[       //require('./a.css||./a.js')
                    {test:/\.css$/,
                     loader:'style-loader!css-loader',
                     //顺序是反过来的2!1
                    },
                    {
                     test:/\.(jpg|svg|png|gif)$/,
                     loader:'url-loader?limit=4096&name=[name].[ext]',
                     //顺序是反过来的2!1 
                     //[name].[ext]内置提供的,因为本身是先读这个文件
                     // options:{
                     //    limit:4096,
                     //    name:'[name].[ext]'
                     // }
                    },{//处理ES6的js
                        test:/\.js$/,
                        loader:'babel-loader',
                        //排除 node_modules下的所有
                        exclude:/node_modules/,
                        options:{
                            presets:['es2015'],//关键字
                            plugins:['transform-runtime'],//函数
                        }
                    },
                    {
                        test:/\.vue$/,
                        loader:'vue-loader'
                    },
                ]
            },
    
            plugins:[
                //插件的执行顺序是依次执行的
                new htmlWebpackPlugin({
                    template:'./src/index.html',
                    })
                    //将src下的template属性描述的文件根据当前配置的output.path,将文件移动到该目录
            ]
    
    
    
        }

     

  •  执行 npm install ,产生node_modules目录,安装模块,然后执行npm run dev,成功打包后访问 http://localhost:8888/,页面为

     

  • 常用指令
  1.  vue中常用的v-指令演示
    * v-text 是元素的innerText只能在双标签中使用
    * v-html 是元素的innerHTML,不能包含<!--{{xxx}} -->
    * v-if 元素是否移除或者插入
    * v-show 元素是否显示或隐藏
    * v-model 双向数据绑定,v-bind是单向数据绑定(内存js改变影响页面)
  2. class结合v-bind使用
    * 需要根据可变的表达式的结果来给class赋值,就需要用到v-bind:class="xxx"
    * v-bind:属性名="表达式",最终表达式运算结束的结果赋值给该属性名
        - 简化的写法是: `:属性名="表达式"`
    * class:结果的分类
        - 一个样式: 返回字符串(三元表达式和key和样式的清单对象)
        - 多个样式:返回对象(样式做key,true或flase做值)
  3.  methods和v-on的使用
    * 绑定事件的方法
        - `v-on:事件名="表达式||函数名"`
        - 简写: `@事件名="表达式||函数名"`
    * 函数名如果没有参数,可以省略()  只给一个函数名称
    * 声明组件内函数,在export default这个对象的根属性加上methods属性,其是一个对象
        - key 是函数名 值是函数体
    * 在export default这个对象的根属性加上data属性,其是一个函数,返回一个对象
        - 对象的属性是我们初始化的变量的名称
    * 凡是在template中使用变量或者函数,不需要加this
    * 在script中使用就需要加上this
  4.  v-for的使用
    * 可以使用操作数组 (item,index)
    * 可以使用操作对象 (value,key,index)

    * key 是类似trank by 的一个属性
    * 为的是告诉vue,js中的元素,与页面之间的关联,当识图删除元素的时候,是单个元素的删除而不是正版替换,所以需要关联其关系,设置(必须,性能)  
    * 2.2.0+ 的版本里,当在组件中使用 v-for 时,key 现在是必须的。

  5. 父子组件使用
    * 父和子,使用的是父,被用的是子
    * 父需要声明子组件,引入子组件对象,声明方式如下

    ```javascript
    import 子组件对象 from './xxx.vue';

        {
            components:{
                组件名:子组件对象
            }
        }
    ```

    * 全局组件,使用更为方便,不需要声明,直接用
    * 在main.js中引入一次,在main.js中使用 `vue.component('组件名',组件对象);`
    * 所有的组件就可以直接通过组件名,使用

  6. 父传子
    * 父组件通过子组件的属性将值进行传递
        - 方式有2:
            + 常量:  prop1="常量值"
            + 变量:  :prop2="变量名"
    * 子组件需要声明
        - 根属性props:['prop1','prop2']
        - 在页面中直接使用{{prop1}}
        - 在js中应该如何使用prop1?   this.prop1获取

  7.  看文档的对象分类
    * 1:全局的代表Vue.的
    * 2:实例的代表this.或者new Vue().
    * 3:选项代表 new Vue() 的参数
    * 或者 export default里边的属性

  8.  子向父组件通信(vuebus)(扩展)
    * 通过new Vue()这样的一个对象,来$on('事件名',fn(prop1,pro2))
    * 另一个组件引入同一个vuebus,  来$emit('事件名',prop1,pro2)

  • 总结

    * 0 : 已经存在node_modules包,已经存在package.json和webpack.config.js文件
    * 1: 创建index.html,看看其所在文件和webpack.config.js文件中描述的关系
    * 2: 在index.html div->id->app
    * 3: 创建main.js,看看其所在文件和webpack.config.js文件中描述的关系
    * 4: 在main.js中引入vue,和相关组件对象
    * 5: new Vue(选项options) , 目的地el   渲染内容 render:c=>c(App) 渲染App的内容
    * 6: 编写app.vue 
        - template 在2.x以后只能有一个根节点
        - script 格式是export default { 选项options}
        - style 加上scoped(范围的)之后,样式只对当前模板有效
    * 7: 可能使用组件或者使用函数或者接受参数
        - options(根属性):
            + data 是一个函数,return一个对象
            + methods 是一个对象,key是函数名,value是函数体
            + components 是一个对象,key是组件名,值是组件对象
            + props 是一个数组,元素是多个接受的参数
    * 8: 套路总结
        - 凡是在上边可以使用的东西
        - 在下边就可以使用,通过this.
    * 9:启动
        - 进入到webpack.config.js 和package.json文件同在的目录中启动命令行
        - 输入: 正在编码:  npm run dev 
            + 报错: 检查命令所执行的../ 上级,是否存在node_modules目录及相关文件是否存在
        - 输入: 代码编写完毕,提交到公司 :  npm run build

  • 案例(指令案例)

  1. 目录结构


     

  2. app.vue

    <template>
    	<div>
    		<pre>
    			*v-text
    			*v-html
    			*v-if
    			*v-show
    			*v-model
    		</pre>
    		v-text:
    		<span v-text = "text"></span>
    		<hr>
    		v-html:
    		<span v-html = "html"></span>
    		<hr>
    		v-if:
    		<div v-if = "isShow" style="height:100px;background-color:red;"></div>
    		<hr>
    		v-show:
    		<div v-show = "isShow" style="height:100px;background-color:red;"></div>
    		<hr>
    		v-model:
    		<input type="text" v-model = "mtest">
    		{{mtest}}
    		<hr>
    		<input type="text" v-bind:value="mtest">
    	</div>
    </template>
    <script>
    	export default{
    		data(){
    			return{
    				text:"我是v-text玩的东西",
    				html:`<ul>
    				    <li>1</li>
    				    <li>2</li>
    				    <li>3</li>
    				    <li>4</li>
    						</ul>`,
    				isShow:true,
    				mtest:"haha",
    			}
    		}
    	}
    </script>
    <style>
    	
    </style>
  3. index.html
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>指令案例</title>
    </head>
    <body>
    	<div id="app">
    	</div>
    </body>
    </html>
     
  4. main.js
    import Vue from "vue";
    import App from "./app.vue";
    
    new Vue({
    	el:"#app",
    	render:function(c){
    		return c(App);
    	}
    })

     

  5. package.jaon

    {
      "name": "03",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "dev":".\\node_modules\\.bin\\webpack-dev-server --inline --hot --open --port 8888",
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "autoprefixer-loader": "^3.2.0",
        "babel-core": "^6.25.0",
        "babel-loader": "^7.1.1",
        "babel-plugin-transform-runtime": "^6.23.0",
        "babel-preset-es2015": "^6.24.1",
        "css-loader": "^0.28.4",
        "file-loader": "^0.11.2",
        "less": "^2.7.2",
        "less-loader": "^4.0.5",
        "style-loader": "^0.18.2",
        "url-loader": "^0.5.9",
        "vue-loader": "^13.0.4",
        "vue-template-compiler": "^2.4.2",
        "webpack": "^3.4.1",
        "webpack-dev-server": "^2.6.1"
      },
      "dependencies": {
        "html-webpack-plugin": "^3.2.0",
        "vue": "^2.4.2"
      }
    }
    

     

  6. webpack.config.js

     const htmlWebpackPlugin = require('html-webpack-plugin');
        const path = require('path')
        module.exports = {
            entry:{ //main是默认入口,也可以是多入口
                main:'./src/main.js'
            },
            //出口
            output:{
                filename:'./build.js', //指定js文件
                path: path.join(__dirname,'dist')          //最好是绝对路径
                //代表当前目录的上一级的dist
            },
            module:{
                //一样的功能rules:   webpack2.x之后新加的
                loaders:[       //require('./a.css||./a.js')
                    {test:/\.css$/,
                     loader:'style-loader!css-loader',
                     //顺序是反过来的2!1
                    },
                    {
                     test:/\.(jpg|svg|png|gif)$/,
                     loader:'url-loader?limit=4096&name=[name].[ext]',
                     //顺序是反过来的2!1 
                     //[name].[ext]内置提供的,因为本身是先读这个文件
                     // options:{
                     //    limit:4096,
                     //    name:'[name].[ext]'
                     // }
                    },{//处理ES6的js
                        test:/\.js$/,
                        loader:'babel-loader',
                        //排除 node_modules下的所有
                        exclude:/node_modules/,
                        options:{
                            presets:['es2015'],//关键字
                            plugins:['transform-runtime'],//函数
                        }
                    },{//解析vue
                        test:/\.vue$/,
                        loader:'vue-loader',//vue-template-compiler是代码上的依赖
                    }
                ]
            },
    
            plugins:[
                //插件的执行顺序是依次执行的
                new htmlWebpackPlugin({
                    template:'./src/index.html',
                    })
                    //将src下的template属性描述的文件根据当前配置的output.path,将文件移动到该目录
            ]
    
    
    
        }
    

     

  7.  执行 npm install ,产生node_modules目录,安装模块,然后执行npm run dev,成功打包后访问 http://localhost:8888/,页面为

    个人认为,光看文档是没有用的,多敲点代码,理解下以下结构:

    第三张图片id与第二张也就是main.js里的el对应,el的值为css选择器如:#id名、.类名。

  • 总结:看代码是没有用的,实在不行,按着我的项目结构、代码都敲一遍,看看能不能成功,出现错误多去百度下,成长就是在不断的解决错误中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值