js与vue基础学习
vue创建项目
安装node
-
安装node、npm、cnpm
node -v npm -v #npm服务器位置处于国外,下载包的速度会比较缓慢。阿里为国内用户提供的cnpm,他是npm的镜像,下载第三方包时,们完全可以使用cnpm来替代npm。 cnpm -v
-
在node中执行JavaScript程序
#输入命令node,按回车键即可进入node的终端,然后可以在这个终端输入JavaScript程序 node# 可以使用node命令执行js文件,例如我们在一个test目录中新建一个hello.js文件,然后在此目录下 node hello.js
创建第一个vue项目
目前前端开发最火热的三大框架分别是React、Angular和Vue
-
全局安装vue-cli
# -g指全局安装,安装在本机中,只安装一次 npm install -g @vue/cli
-
vue创建项目
vue create hello
-
创建项目后,根据相应提示进入项目目录中,使用命令启动项目
npm run serve # 启动后根据提示的url访问
-
项目简介
- node_modules:存放项目依赖包
- public:存放静态文件(例如图片等)
- src:项目源文件,后续开发几乎都在这个目录下进行
- main.js为项目的入口文件
- App.vue是单文件组件
- 自定义组件一般在
components
目录中创建,命名用大驼峰的方式。
-
组件化开发
- 以vue为后缀的文件是vue的单文件组件,我们在开发vue应用的过程中,主要任务就是去编写这些以vue为后缀的文件。大家可以把组件理解成一个,可以自定义的,有更强大功能的标签。
//main.js文件说明 import Vue from 'vue' import App from './App.vue'Vue.config.productionTip = false //配置开发选项,开发过程中的错误提示new Vue({render: h => h(App),//上面render箭头函数相当于下面的return,h也是一个函数createElement,将App组件作为参数传入//作用:将App.vue组件传入,createElement可以将App组件渲染到#app(index.html中的id=app的DOM节点),//从而将组件加载到html文件中对应DOM节点中,这样,就成功地将单文件组件App.vue加载到index.html中了// return (createElement){// return createElement(app);// } }).$mount('#app')
vue语法
vue文件说明
<template><!-- 组件的应用 -->
</template><script>// 导入其他组件,定义该组件的数据、方法等
</script><style>/* 组件的样式 */
</style>
- template标签中添加的是html代码,template内部所有内容都要包含在一个标签之内。
- script标签中添加的是JavaScript代码
- style标签中添加的是CSS样式。
例子:
<template><!-- template:网页模板,编写的是html代码,template内部所有内容都要包含在一个标签之内 --><div id="app"><img alt="Vue logo" src="./assets/logo.png"></div>
</template><script>
// script标签中添加的是JavaScript代码
import HelloWorld from './components/HelloWorld.vue'
//用模块化的语法export default将组件的示例暴露给外部,这样组件文件才能被使用
export default {name: 'App',components: {HelloWorld}
}
</script><style>
/* style标签中添加的是CSS样式 */
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;
}
</style>
vue模板语法
-
指令
指令 (Directives) 是带有
v-
前缀的特殊属性- v-bind:绑定属性**(简写:)**
- v-on:绑定事件**(简写@)**
绑定属性和事件的方法:
<template><div><h1 :title="message">hello world</h1><button @click="sayHi">say hi</button></div> </template><script> export default {data(){return {message:"hello vue"}},methods:{sayHi(){alert("Hi!")}} } </script>
-
条件判断
通过
v-if
和v-show
指令可以控制元素的显示与隐藏:v-if='false'
:不会渲染DOM,浏览器控制台查看元素不可见。v-show='false'
:会渲染DOM,查看元素可见,但是样式为display:none;
,即前端样式用户不可见
-
显示列表v-for指令
显示列表的功能在web应用中是非常常见的,例如文章列表、博客列表,学生列表等等,可以使用
v-for
指令将数据绑定在列表中
组件嵌套
-
引入组件+注册组件
<script> import Hello from "@/components/Hello" import HelloWorld from "@/components/HelloWorld" //引入组件 export default {components:{Hello,HelloWorld //注册组件} } </script>
-
使用引入的组件
<template><div><Hello img=“”></hello><HelloWorld></HelloWorld> <!-- 该标签是自定义组件,引入后可当标签使用 --><!-- 在template中,组件的标签不区分大小写,切驼峰命名的组件可以使用 - 链接 ,下面的和HelloWorld是同一个标签--><Hello-World></Hello-World><hello-world></hello-world></div> </template>
组件传值
-
组件传值3种情况
- 父级向子级传递数据
- 子级向父级传递数据
- 非父子级传递数据
-
父级向子级传值
父级可以通过属性向子级传递数据:
- 创建子组件,在src/components/文件夹下新建一个Child.vue
- Child.vue的中创建props,然后创建一个名为message的属性
//父级App.vue <template><div><h1>hello world</h1><!-- 父级通过属性向子级传递数据 --><child :msg="message"></child></div> </template><script> import Child from "./components/Child.vue" export default{components:{Child},data(){return {message:"app.vue data"}} } </script><style></style>
//子级Child.vue <template><div><h1>{{msg}}</h1></div> </template><script>export default{// 子级获取父级的数据通过props属性,msg为子级标签自定义的属性props:["msg"] } </script>
-
子级向父级传递数据
子级想父级传递数据需要用自定义事件:
//父级App.vue <template><div><h1>{{childData11}}</h1><!-- 父级通过属性向子级传递数据 --><child @myevent="changeData1" :msg="message"></child></div> </template><script> import Child from "./components/Child.vue" export default{components:{Child},data(){return {message:"app.vue data",childData11:"" //默认值}},methods:{changeData1(childData1){this.childData11=childData1;}} } </script><style></style>
//子级Child.vue <template><div><h1>{{msg}}</h1><!-- 点击按钮时触发sendData方法 --><button @click="sendData">向父级传递数据</button> </div> </template><script>export default{// 子级获取父级的数据通过props属性,msg为子级标签自定义的属性props:["msg"],data(){return {childData:"I am child"}},methods:{sendData(){this.$emit("myevent",this.childData) //通过$emit方法可以触发父级的自定义事件,第二个参数是myevent调用函数的参数}} } </script>
-
非父子级组件传值
目录结构:
- src
- components
- Sister.vue
- Brother.vue
- store.js
- main.js
- components
//store.js export default {state:{message:"hello vue"},setStateMessage(str){this.state.message = str;} }<!-- sister组件 --> <template><h1>{{state.message}}</h1> </template><script> import store from "../store.js" export default {data(){return {title:"sister组件",state:store.state}} } </script><!-- brother组件 --> <template><div><button @click="changeData">change data</button></div> </template><script> import store from "../store.js" export default {methods:{changeData(){store.setStateMessage("122");console.log(store.state.message)}} } </script>
- src
参考资料
文档资料:https://xiaozhoubg.com/book/section/145
视频:https://www.bilibili.com/video/BV1er4y1P7UN?p=6
vue官网:https://cn.vuejs.org/v2/guide/#%E8%B5%B7%E6%AD%A5
js基础
变量与运算符
-
var**(最新版本ES2015使用let,let语法更严谨)**
var s = "hello world"; //var用来声明变量 var s1 = "hello",s2="world"; //逗号可以连续声明变量
-
浏览器console控制台打印
console.log(s1);
-
数据类型6种
var s = "hello"; //字符串 String类型 var s2 = 100; //数值 Number类型 var s3 = true; //布尔类型 Boolean //另外 //未定义类型(Undefined):undefined,变量未赋值,值为undefined var v; console.log(v); //v的值为undefined //空类型(Null):null,未初始化一个对象,可以暂时赋值null //对象(Object):{}
-
注意:运算符
//==与=== console.log(20=="20"); //true,不比较数据类型 console.log(20==="20"); //false,常用 //!=与!== console.log(20!="20"); //false console.log(20!=="20"); //true,常用//逻辑与或时,常用===和!==
函数
-
语句块用{}括起来
-
函数通过function关键字声明,声明时不执行,调用时才执行;
//声明函数 function fun(){//语句 } //调用函数,调用写在声明前也可以正常调用(函数提升特性) fun();
-
函数表达式
//函数表达式,没有函数提升特性 const fun = function(n,m){return n+m; } let result = fun(10,20); //直接用fun调用
-
函数默认值
function fun = function(n=10,m=20){return n+m; } let result = fun(); //没有实参时使用默认值 console.log(result); let result = fun(30,5); //有实参时使用实参 console.log(result); let result = fun(100); //也可以传一个实参,另一个使用默认值 console.log(result);
-
立即执行函数
//两个(),即声明完直接执行,只能调用一次 (function(){console.log("hello") })()
-
箭头函数
//原函数 const fun = function(x){return x * x; } let result = fun(2); console.log(result); //对应的箭头函数,删去function,在()和{}之间加个箭头 const fun = (x) => { return x * x; } //一个参数时,还可以在简化 const fun = x => x * x;
-
箭头函数中的this;
- 普通函数中的this指向的是调用该函数的对象
- 箭头函数:this在哪里定义,就指向谁
const cat = {name:"miaomiao",sayName(){setInterval(function(){console.log(this.name)},1000) //定时函数,每1000ms执行一次function} } cat.sayName(); //这时无法输出miaomiao,因为定时函数setInterval返回的是window类型,setInterval内部的this指向的是setInterval函数//使用箭头函数 const cat = {name:"miaomiao",sayName(){setInterval(() => {console.log(this.name)},1000) } } cat.sayName(); //这时输出miaomiao
对象
-
js中的对象:是6种数据类型中的一种;属性的无序集合
//定义对象 var cat = {name: "miaomiao",age: 16 } //使用属性 console.log(cat.age); //.方式,一般常用 console.log(cat["age"]); //[""]方式
-
对象的某个属性可以是函数值
var cat = {name: "miaomiao",age: 16,sayName: function(){console.log("我是苗苗")},sayName(){ //最新版本ES2015的简写方式,不写functionconsole.log("我是苗苗")},eat: function(food){console.log("吃"+ food);},computed:function(x,y){return x+y;} } //调用 cat.sayName() cat.eat("鱼") var result = cat.computed(1,3); console.log(result);
-
属性赋值
var cat = {name: "miaomiao",sayName: function(){console.log("我是"+this.name)},eat: function(food){console.log("吃"+ food);},computed:function(x,y){return x+y;} }//赋值使用 cat.name="小白"; cat.sayName(); //输出”“我是小白
-
对象类型
- 自定义对象:封装
- 内置对象:例如Date,获取当前时间
- 宿主对象:document
- 第三方对象:jQuery、vue等
面向对象
-
ES5版本没有类的概念,通过构造函数实现,构造函数函数名首字母大写
function Dog(n,a){this.name=n;this.age=a; }//通过原型对象prototype,为构造函数生成的对象赋予新的方法 Dog.prototype.sayName = function(){console.log('我的名字是${this.name}'); }var dog = new Dog("小白",2); console.log(dog.name);var dog1 = new Dog("小白2",2); dog1.sayName();
-
ES2015(ES6)的面向对象:class
class Dog{constructor(name,age){ //构造函数this.name=name;this.age=age;}sayName(){ //其他方法console.log('我的名字是${this.name}');} } let dog = new Dog("小白",2); console.log(dog.name); dog.sayName();
-
ES6的继承
class Animal{constructor(name){ //构造函数this.name=name;}sayName(){ //其他方法console.log('我的名字是${this.name}');} }class Dog extends Animal{ //继承constructor(name,age){ //构造函数super(name);this.age=age;} }let dog = new Dog("小白"); dog.sayName();let dog = new Dog("小白",2); console.log(dog.age);
数组
-
定义数组
var list = ["a","b"]; var list = new Array("a","b"); //new 构造函数//使用 console.log(list); var item=list[0]; console.log(item); var length=list.length; console.log(length);
-
遍历数组
//while\for循环 //for in 遍历:i是索引值 for(var i in list){console.log(list[i]); } //for of 遍历:i是元素值 for(var i of list){console.log(i); } //map方法遍历:参数是函数 list.map(function(value,index){console.log(value); //输出值console.log(index); //输出索引 });
-
数组的常用方法
-
map方法
-
push方法:在数组最后追加元素,list.push(“f”)
-
sort方法:排序
-
filter方法:过滤器
var list = [1,3,6,5,2]; var newList = list.filter(function(item){if(item>=3){return item; //满足条件的放入newList里} }) console.log(newList); //过滤出大于等于3的组成新的数组
-
join方法:连接数组里元素成字符串
var list = ["a","b"]; var str = list.join("+"); //参数为连接符 console.log(str); //输出字符串类型:a+b
-
-
结合数组与对象
var list = [{name:"小明",age:2,sex:"男"},{name:"小明2",age:3,sex:"女"},{name:"小明3",age:4,sex:"男"}, ]console.log(list[0].name); //遍历:找出所有男同学放入新数组 var newList = list.filter(function(item){if(item.sex==="男"){return item; //满足条件的放入newList里} }) console.log(newList);
正则表达式
-
定义正则表达式
var str = "123aa"; var reg = /^[a-z]$/; //正则表达式,匹配字母 reg.test(str); //正则表达式对象的test方法可以检测是否匹配,匹配成功返回true reg.exec(str); //exec方法可以输出匹配的内容
DOM & BOM基础
-
DOM
- dom:文档对象模型(document对象)
//事件函数 <body><button>按钮</button><div class="box"> </div><div> <img src="image/1.jpg" alt=""></div><script>let btn = document.querySelector("button");btn.onclick = function(){ //事件监听函数,点击事件console.log("hello");img.src="image/2.jpg"; //改变图片,鼠标点击后切换图片}let box = document.querySelector(".box");box.onmouseenter = function(){ //事件监听函数,鼠标移入事件console.log("hello red");this.style.backgroundColor= "blue"; //设置样式,鼠标移入背景变蓝}box.onmouseleave = function(){ //事件监听函数,鼠标移出事件console.log("hello box");}</script> </body>
-
BOM
- bom:浏览器对象模型
- window对象(全局对象)
- screen对象,包含用户屏幕信息
- location对象,获取当前页面的url,并把浏览器重定向到新的页面
- history对象,包含浏览器历史
- navigator对象,包含有关访问者浏览器的信息
文档:https://www.w3cschool.cn/javascript/js-window-screen.html
- bom:浏览器对象模型
参考资料
学习视频:https://www.bilibili.com/video/BV1GC4y1p7Nu?spm_id_from=333.788.b_636f6d6d656e74.5
视频中代码:https://github.com/xiaozhoulee/xiaozhou-frontend
文档:https://xiaozhoubg.com/book/section/56