文章目录

  • Vue学习笔记
  • 1. 概述、特征、以及初始化
        • 1.1 引用Vue的方法
  • 2. 创建、显示、更新列表
  • 3. 案例:计数器
  • 4. 关于插值的操作
        • 4.1 mustache 语法
        • 4.2 v-once 指令
  • 5. v-bind 数据绑定
        • 5.1 v-bind 的基本使用
        • 5.2 v-bind 绑定到class有两种方式 对象语法和数组语法**
  • 6. 计算属性
        • 6.1 复杂操作
  • 7. es6语法补充
        • 7.1 可变参数
        • 7.2 for of 的使用**
        • 7.3 高阶函数 filter/map/reduce
            • 7.3.1.filter函数的使用
            • 7.3.2.map函数的使用
            • 7.3.3.reduce函数的使用
            • 4.高阶函数链式编程
  • 8. 事件监听
        • 8.1 v-on的基本使用
        • 8.2 v-on的参数问题
        • 8.3 v-on修饰符
  • 9. 条件判断
        • 9.1 v-if 和 v-else的使用
        • 9.2 登陆切换的一个小案例
        • v-show的使用
  • 10. 循环遍历
        • 10.1 遍历数组
        • 10.2遍历对象
        • 10.2 v-for使用过程绑定key
        • 10.3哪些数组的方法是响应式的
            • push(), pop(), shift(), unshift(), splice(), sort(), reverse()
            • 10.3.1 一个点击变色小作业的实现
  • 11. 书籍购物车案例
        • 11.1过滤器的实现
        • 11.2计算总价格的四种循环实现方法
        • 11.3 v-if/else的实现
  • 12. v-model使用
        • 12.1 v-model基本使用
        • 12.2 v-model原理
        • 12.3 v-model结合radio类型
        • 12.4 v-model结合checkbox单选、多选框使用
        • 12.5 v-model结合checkbox进行值绑定
        • 12.6 v-model结合select
        • 12.7 v-model修饰符的使用
  • 13. 组件化
        • 13.1 注册组建的基本步骤
        • 13.2 注册组件步骤解析
        • 13.3 局部组件和全局组件
        • 13.4 父组件和子组件
        • 13.5 组件的语法糖注册方式
        • 13.6 模板的抽离写法
        • 13.7 组件中的数据存放问题
        • 13.8 组件中的data为什么是函数
        • 13.9 父组件向子组件添加数据
        • 13.10 props中的驼峰标识
        • 13.11 组件通信-子传父(自定义事件)
        • 13.12 父子组件通信案例
        • 13.13 组件访问-父访问子-children-refs
        • 13.14 组件访问-子访问父-parent-root
  • 14. 组件化高级
        • 14.1 slot插槽的基本使用
        • 14.2 具名插槽的使用(v-slot)
        • 14.3 什么是编译的作用域
        • 14.4 作用域插槽
  • 15 前端模块化
        • 15.1 es6 模块化实现
  • 16. webpack的一些配置
  • 17. vue-cli
        • 17.1 runtimecompiler 和 runtimeonly的区别
        • 17.2 vue的配置
        • 17.3 箭头函数补充
  • 18. vue-router
        • 18.1 url的hash 和 html5 的history
        • 18.2 配置路由相关的信息
        • 18.3 router-link的其他属性补充
        • 18.4 通过代码的方式修改路径
        • 18.5 动态路由
        • 18.6 路由的懒加载
        • 18.7 嵌套路由
        • 18.8 全局导航守卫
  • 19. Promise
        • 19.1 Promise 的三种状态
  • 20. vuex

Vue学习笔记

1. 概述、特征、以及初始化

  • Vue 是一种灵活的渐进式相应框架
  • 采用声明式的编程范式

1.1 引用Vue的方法

<script src="../js/vue.js"></script>
<script>const app = new Vue({el: '#app', //用于挂载需要挂载的元素data: {message: 'fuck you'}})</script>

通过采用el挂载和HTML代码定义id的方式来使用Vue.
data是vue实例对应的数据对象
methods定义属于vue的一些方法,可以再其他地方调用,也可以在指令中使用

2. 创建、显示、更新列表

<div id="app"><ul><li v-for="item in movies">{{item}}</li></ul></div><script src="../js/vue.js"></script><script>const app = new Vue({el: '#app',data: {message: 'ssda',movies: ['星际穿越', '大话西游', '少年派'],}})</script>

声明式的编程范式,使得列表操作变得简易。

3. 案例:计数器

包含新的指令,v-on 和新的属性 methods,可以通过函数的形式来匹配复杂的操作

 <button v-on:click="add">+</button><button v-on:click="sub">-</button></div><script src="../js/vue.js"></script><script>const app = new Vue({el: '#app',data: {counter: 0},methods: {add: function () {console.log('+++')this.counter++},sub: function () {console.log('---')this.counter--}},})</script>

此处 v-on:click 可以用语法糖 @click 来替代。

4. 关于插值的操作

4.1 mustache 语法

 <h2>{{message}}, 李银河!</h2><h2>{{firstName + lastName}}</h2>

mustache语法中不仅可以写变量,亦可以写简单的表达式。

4.2 v-once 指令

表示页面的元素和组件只渲染一次,不会随着数据的改变而改变。

<h2 v-once>{{message}}</h2>

v-for 指令
表示循环元素或组件中的内容,后接表达式。

<ul><li v-for="item in movies">{{item}}</li>
</ul>

v-html 指令
表示有选择性地解析html中的内容

<h2 v-html='url'>{{url}}</h2>

v-text 指令

<h2 v-text='message'>,栗子</h2>

表示显示指定的数据,但是很不灵活,会直接覆盖原标签内的数据,而且不支持拼接等操作。
该指令用得不多

v-pre 指令

<h2 v-pre>{{message}}</h2>

表示原封不动地显示标签内的内容,而不会对其进行解析。
该指令用得不多

v-cloak 指令
一般用来消除抖动

<style>[v-cloak] {display: none}
</style><div id="app"><h2 v-cloak>{{message}}</h2></div><script src="../js/vue.js"></script><script>// 由于 v-cloak 在被解析之后会被删除,所以// 在vue解析之前,div中有v-cloak属性// 在vue解析之后,div中没有v-cloaksetTimeout(function () {const app = new Vue({el: '#app',data: {message: '你好'}})}, 1000)</script>

5. v-bind 数据绑定

5.1 v-bind 的基本使用

绑定属性

<img v-bind:src='imgURL' alt="谷歌">
<a v-bind:href="ahref">百度一下</a>

v-bind 语法糖

<a :href="ahref">百度一下</a>

实际上是省略了v-bind指令。

5.2 v-bind 绑定到class有两种方式 对象语法和数组语法**

用法一 可以直接通过{}绑定一个类
用法二 可以通过判断传入多个值
用法三 和普通的类同时存在,并不冲突

v-bind 绑定到class(对象语法)
此案例添加了一个按钮,并设置了一个监听事件,使得点击按钮时改变绑定到<h2>的class中的布尔值,从而实现对样式的改变。

<div id='app'><h2 v-bind:class='{active: isActive, line: isLine}'>{{message}}</h2><button v-on:click='btnClick'>按钮</button></div><script src="../js/vue.js"></script><script>const app = new Vue({el: '#app',data: {message: '你好',isActive: true,isLine: false,},methods: {btnClick: function () {this.isActive = !this.isActive}}})

v-bind 绑定到class(数组语法)

<div id='app'><h2 class="title" :class="[active, line]">{{message}}</h2><h2 class="title" :class="getClasses()">{{message}}</h2></div><script src="../js/vue.js"></script><script>const app = new Vue({el: '#app',data: {message: 'hello',active: 'one',line: 'two'},methods: {getClasses: function () {return [this.active, this.line]}}})</script>

v-bind 动态绑定style(对象语法)

原理大致相同,引号后面改成style即可。

<div id='app'><!-- <h2 v-bind:style='{属性名:属性值}'>{{message}}</h2> --><!-- <h2 v-bind:style='{fontSize: theSize + "px", color: theColor}'>{{message}}</h2> --><h2 v-bind:style='getStyles()'>{{message}}</h2></div><script src="../js/vue.js"></script><script>const app = new Vue({el: '#app',data: {message: 'hello',theSize: 100,theColor: 'red',},methods: {getStyles: function () {return { fontSize: this.theSize + "px", color: this.theColor }},}})</script>

v-bind 动态绑定style(数组语法)

 <div id="app"><h2 :style='[baseStyle, baseStyle1]'>{{message}}</h2></div><script src='../js/vue.js'></script><script>const app = new Vue({el: '#app',data: {message: 'hello',baseStyle: { backgroundColor: 'red' },baseStyle1: { fontSize: '88px' }}})</script>

6. 计算属性

特点:html代码里面非常清晰

<h2>{{fullMessage}}</h2></div><script src="../js/vue.js"></script><script>const app = new Vue({el: '#app',data: {message: 'asd',message2: 'dd',},computed: {fullMessage() {return this.message + ' ' + this.message2}},methods: {getFullMessage() {return this.message + ' ' + this.message2}}})</script>

6.1 复杂操作

<script>const app = new Vue({el: '#app',data: {books: [{ id: 110, name: 'Unix程艺术', price: 119 },{ id: 111, name: 'Unx编程艺术', price: 1192 },{ id: 112, name: 'Uix编程艺术', price: 1191 },{ id: 113, name: 'Uni编程艺术', price: 11945 },]},methods: {},computed: {totalPrice: function () {let result = 0// for (let i = 0; i < this.books.length; i++) {//   result += this.books[i].price// }for (let book of this.books) {result += book.price}return result}}});</script>

7. es6语法补充

<script>// 属性的增强写法const name = 'chen'const age = 18const obj = {name: name,age: age}//以上是es5的写法// es60的写法如下const obj = {name, age}// 函数的增强写法//es5中的const obj = {run: function () {},eat: function () {},}//es6中的const obj = {run() {},eat() {},}</script>

var没有块级作用域,所以用let
const指定对象之后不可更改,但是const内部可以进行更改

7.1 可变参数

function sum(...num) {console.log(num)
}
sum(1,2,3,4,5)

7.2 for of 的使用**

var arr = ['nick','freddy','mike','james'];
for(let item of arr){	console.log(item);
}

数组对象都支持,非常的简洁!

7.3 高阶函数 filter/map/reduce

7.3.1.filter函数的使用

filter中的回调函数有一个要求:必须返回一个boolean值
true:当返回true时,函数内部会自动将这次回调的n加入到新的数组中
false:当返回false时,函数内部会过滤掉这次的n

const nums = [10, 230, 22, 55, 11]
let newNums = nums.filter(function(n) {return n < 100
})
7.3.2.map函数的使用
let new2Nums = newNums.map(function(n) {return n * 2
})
7.3.3.reduce函数的使用

作用:对数组中的所有内容进行汇总。

new2Nums.reduce(function(preValue, n) {return preValue + n
}, 0)
4.高阶函数链式编程
const nums = [1,2,3,55,66,22,66,33]
let total = nums.filter(function(n) {return n < 100
}).map(function (n) {return n * 2
}).reduce(function (prevValue, n) {return prevValue + n
}, 0)// 箭头函数
let total2 = num.filter(n => n < 100).map(n => n * 2).reduce((pre, n) => pre + n)

8. 事件监听

8.1 v-on的基本使用

<div id='app'><h2>{{message}}</h2><h2>{{counter}}</h2><!-- <button v-on:click="increment">+</button><button v-on:click="decrement">-</button> --><button @click="increment">+</button><button @click="decrement">-</button></div><script src='../js/vue.js'></script><script>const app = new Vue({el: '#app',data: {message: 'Hello, world!',counter: 0},methods: {increment() {return this.counter++},decrement() {return this.counter--},},computed: {},})</script>

8.2 v-on的参数问题

<div id='app'><!-- 事件调用的方法没有参数 --><button @click="btnClick()">按钮1</button><!-- 在事件定义时,写方法时省略了小括号,但是方法本身是需要一个参数的,这个时候,vue会默认将浏览器生成的event对象作为参数传入到方法。 --><button @click="btn2Click">按钮2</button><!-- 方法定义时,我们需要event对象,同时又需要其他参数 --><!-- 在调用方法时,如何手动获取到浏览器参数的event对象:$event --><button @click="btn3Click(123, $event)">按钮3</button><button>按钮4</button></div><script src='../js/vue.js'></script><script>const app = new Vue({el: '#app',data: {event: 'chen'},methods: {btnClick() {console.log('hello world!')},btn2Click(item) {console.log('====', item)},btn3Click(item, event) {console.log('+++++', item, event);}}})</script>

8.3 v-on修饰符

<div @click='divClick'>点这里<button @click.stop="btnClick">按钮1</button></div><br><div><!-- 2.prevent 修饰符使用,阻止默认事件 --><form action='baidu'><input type='submit' value="提交" @click.prevent='submitClick'></form><!-- 3.监听某个键盘案件的点击,加.enter 则监听回车 --><input type='text' @keyup='keyUp'><!-- 4.once修饰符的使用  只触发一次回调--><button @click.once="btn2Click">按钮2</button></div>

9. 条件判断

9.1 v-if 和 v-else的使用

<div id='app'><h2 v-if='score>=90'>优秀</h2><h1 v-else-if='score>=80'>良好</h1><h1 v-else-if='score>=60'>及格</h1><h1 v-else>不及格</h1></div>

指令判断,不建议写到标签里,建议写计算属性

9.2 登陆切换的一个小案例

<div id='app'><span v-if='isUser'><label for="username">用户账户</label><input type="text" id="username" placeholder="用户账户"></span><span v-else=''><label for="useremail">用户邮箱</label><input type="text" id="useremail" placeholder="用户邮箱"></span><button @click='isUser=!isUser'>切换类型</button></div>

如果不希望输入框内容复用。可以加入一个key属性

<span v-if='isUser'><label for="username">用户账户</label><input type="text" id="username" placeholder="用户账户" key='username'></span><span v-else=''><label for="useremail">用户邮箱</label><input type="text" id="useremail" placeholder="用户邮箱" key='useremail'></span>

v-show的使用

<div id='app'><h2 v-if='isShow' id='aaa'>{{message}}</h2><h2 v-show='isShow' id='bbb'>{{message}}</h2></div>

v-if中,条件为false时,包含v-if指令的元素,根本不会出现在dom中。
v-show中,当条件为false时,v-show只是给元素增加了一个行内样式 display:none。
如何选择:频繁切换时用show,否则用if。

10. 循环遍历

10.1 遍历数组

<div id='app'><!-- 1.在遍历的过程中,没有使用索引值 --><h2>{{message}}</h2><ul><li v-for='item in names'>{{item}}</li></ul><!-- 2.在遍历的过程中,获取索引值。 --><ul><li v-for='(item, index) in names'>{{index+1}}.{{item}}</li></ul></div>

10.2遍历对象

<div id='app'><!-- 1.在遍历对象的过程中,如果只是获取一个值,那么获取到的是value --><ul><li v-for='item in info'>{{item}}</li></ul><!-- 2.获取key和value 格式(value, key)--><ul><li v-for='(value, key) in info'>{{key}}-{{value}}</li></ul><!-- 3.获取key和value和index 格式(value, key index) --><ul><li v-for='(value, key, index) in info'>{{key}}-{{value}}-{{index}}</li></ul></div>

10.2 v-for使用过程绑定key

<ul><li v-for='item in letters' v-bind:key='item'>{{item}}</li>
</ul>

添加唯一标志key进行绑定后,中间插入效率高。

10.3哪些数组的方法是响应式的

push(), pop(), shift(), unshift(), splice(), sort(), reverse()
methods: {btnClick() {// 1.push方法。改变的时候是响应式的this.letters.push(this.mark)this.mark += 1// 2.pop(),响应式,删除数组中最后一个元素。this.letters.pop();// 3.shift(),响应式,删除数组中的第一个元素。this.letters.shift();// 4.unshift(), 响应式,在数组开头添加元素this.letters.unshift('thing', 'asd', 'ddd')5.splice()// 可以删除、插入、替换元素// 删除元素: 第二个参数传入你要删除几个元素(如果不传,则删除后面所有的元素)// 替换元素: 第二个参数表示我们要替换几个元素,后面接用于替换的元素// 插入元素:第二个参数,传入0,后面跟上要插入的元素。// splice(start, ), 响应式this.letters.splice()// 6.sort() 响应式,排序this.letters.sort()// 7.reverse() 响应式,反转this.letters.reverse()// 0.通过索引值修改数组中的元素,不是响应式this.letters[0] = 'haa'},

通过索引值修改数组中的元素,不是响应式

this.letters[0] = 'haa'

Vue中定义的响应式修改方式:

Vue.set(this.letters, 0, 'bbbbbb')
10.3.1 一个点击变色小作业的实现
<ul><li v-for='(item, index) in movies' v-bind:key='item' v-bind:class='{active: currentIndexL === index}'@click='liClick(index)'>{{item}}</li></ul></div><script src='../js/vue.js'></script><script>const app = new Vue({el: '#app',data: {message: 'Hello world!',movies: ['海王', '肖申克的救赎', '海上钢琴师', '复仇者联盟'],currentIndex: 0,},methods: {liClick(index) {this.currentIndex = index}}})</script>

解决此作业的精髓在于:在列表处循环时讲index 分离出来,并在点击事件中调用liClick(index)方法时把index传回去,并在data里面定义一个currentIndex来记录状态,作为动态绑定样式的依据,非常精妙!妙啊!

11. 书籍购物车案例

11.1过滤器的实现

<td>{{item.price | getFinalPrice}}</td>
filters: {getFinalPrice (price) {return '$' + price.toFixed(2)}

11.2计算总价格的四种循环实现方法

computed: {totalPrice () {let totalPrice = 0// 1.普通的for循环// for (let i = 0; i < this.books.length; i++) {//   totalPrice += this.books[i].price * this.books[i].count// }// return totalPrice// 2.for (let i in this.books)// for (let i in this.books) {//   totalPrice += this.books[i].price * this.books[i].count// }// return totalPrice// 3. for的// for (let item of this.books) {// totalPrice += item.price * item.count// }//return totalPrice//}//},// 4.reduce实现return this.books.reduce((pre, book) => pre + book.price * book.count)}},

11.3 v-if/else的实现

<div id='app'><div v-if='books.length'><table><thead><tr><th></th><th>书籍名称</th><th>出版日期</th><th>价格</th><th>购买数量</th><th>操作</th></tr></thead><tbody><tr v-for='(item, index) in books'><td>{{item.id}}</td><td>{{item.name}}</td><td>{{item.date}}</td><!-- <td>{{getFinalPrice(item.price)}}</td> --><td>{{item.price | getFinalPrice}}</td><td><button @click='decrement(index)' v-bind:disabled='item.count <= 1'>-</button>{{item.count}}<button @click='increment(index)'>+</button></td><td><button @click='removeHandle(index)'>移除</button></td></tr></tbody></table><h2>总价格 {{totalPrice | getFinalPrice}}</h2></div><h2 v-else>购物车为空</h2></div>

12. v-model使用

12.1 v-model基本使用

<div id='app'><input type="text" v-model='message'><h2>{{message}}</h2>
</div>

12.2 v-model原理

v-model其实是一个语法糖,它的背后本质上时包含两个操作:
1.v-bind绑定一个value属性.
2.v-on指令给当前元素绑定input事件.

<input type="text" v-bind:value='message' v-on:input='message = $event.target.value'>

12.3 v-model结合radio类型

<div id='app'><h2>您选择的性别是:{{sex}}</h2><label for='male'><input type="radio" id='male' name='gender' value="男zxc" v-model='sex'></label><label for='female'><input type="radio" id='female' name='gender' value="" v-model='sex'></label>
</div>

12.4 v-model结合checkbox单选、多选框使用

单选框对应布尔值,多选框则对应数组类型。

<div id='app'><!-- checkbox单选框 --><!-- <label for="license"><input type="checkbox" id='license' v-model='isAgree'>同意协议</label> --><!-- <h2>您选择的是{{isAgree}}</h2><button v-bind:disabled='!isAgree'>下一步</button> --><!-- checkbox复选框 --><label for="hobby1"><input type="checkbox" value="" id='hobby1' v-model='hobbies'></label><label for="hobby2"><input type="checkbox" value="" id='hobby2' v-model='hobbies'></label><label for="hobby3"><input type="checkbox" value="Rap" id='hobby3' v-model='hobbies'>Rap</label><label for="hobby4"><input type="checkbox" value="篮球" id='hobby4' v-model='hobbies'>篮球</label><h2>您的爱好是: {{hobbies}}</h2></div>

12.5 v-model结合checkbox进行值绑定

值不要写死,去动态获取

<label v-for='item in originHobbies' v-bind:for='item'><input type="checkbox" v-bind:value="item" v-bind:id='item' v-model='hobbies'>{{item}}</label><h2>您的爱好是: {{hobbies}}</h2></div><script src="../js/vue.js"></script><script>const app = new Vue({el: '#app',data: {message: 'Hello world!',isAgree: false,hobbies: [],originHobbies: ['唱', '跳', 'rap', '篮球']}})</script>

12.6 v-model结合select

<div id='app'><select name='name' v-model='fruit'><option value=""></option><option value=""></option><option value="rap">rap</option><option value="篮球">篮球</option></select><h2>{{message}} {{fruit}}</h2></div>

select多选现在用的不多,不做介绍。

12.7 v-model修饰符的使用

<div id='app'><!-- 修饰符lazy,添加后不实时更新,失去焦点时再更新 --><input type="text" v-model.lazy='message'><h2>{{message}}</h2><!-- 修饰符number,强制将绑定值更新为number类型 --><input type="text" v-model.number='age'><h2>{{age}}-{{typeof age}}</h2><!-- 修饰符trim,剥除空格 --><input type="text" v-model.trim='name'><h2>您输入的名字:{{name}}</h2></div>

13. 组件化


13.1 注册组建的基本步骤

  1. 创建组件构造器
  2. 注册组件
  3. 使用组件
  4. 调用Vue.extend()方法创建组件构造器
  5. 调用Vue.component()方法注册组件
  6. 在Vue实例的作用范围内使用组件
<script>// 1. 创建组件构造器对象const cpnC = Vue.extend({template: `<div><h2>我是蔡徐坤!</h2><p>唱</p><p>跳</p><p>rap</p><p>篮球</p></div>`})// 2.注册组件Vue.component('my-cpn', cpnC)const app = new Vue({el: '#app',data: {message: 'Hello world!'}})</script>

13.2 注册组件步骤解析

Vue.extend():

  • 调用Vue.extend()创建的是一个组件构造器。
  • 通常在创建组件构造器时,传入template代表我们自定义的模板。
  • 该模板是在使用到组建的地方,要显示的HTML代码。
  • 事实上,现在多用语法糖来处理。

13.3 局部组件和全局组件

注:此为比较老的方法

<div id='app'><h2>{{message}}</h2><!-- 3. 使用组件 --><my-cpn></my-cpn><cpn></cpn></div><div id='app2'><my-cpn></my-cpn><cpn></cpn></div><script src="../js/vue.js"></script><script>// 1. 创建组件构造器对象const cpnC = Vue.extend({template: `<div><h2>呵呵</h2></div>`})// 2.注册组件(全局组件,意味着可以在多个Vue的实例下面使用)Vue.component('my-cpn', cpnC)// 疑问:怎么注册的组件才是局部组件?const app = new Vue({el: '#app',data: {message: 'Hello world!'},components: {// cpn-使用组件时的标签名cpn: cpnC}})const app2 = new Vue({el: '#app2',})</script>

13.4 父组件和子组件

这里像套娃一样,可以再父组件的构造器中注册子组件,之后可以在父组件的template中调用子组件的template。
但是至少需要在根组件中注册父组件、而且子组件在未被根组件注册时并不能使用其中的模板!

<script>// 构建子组件构造器?const cpn1 = Vue.extend({template: `<div><p>呵呵</p></div>`})// 构建父组件构造器const cpn2 = Vue.extend({template: `<div><p>吼吼</p><cpn1></cpn1></div>`,components: {cpn1,}})const app = new Vue({el: '#app',data: {message: 'Hello world!'},components: {cpn2,cpn1}})</script>

13.5 组件的语法糖注册方式

<script>// 语法糖注册全局组件Vue.component('cpn1', {template: `<div><h2>mdzz</h2></div>`})const app = new Vue({el: '#app',data: {message: 'Hello world!',},// 语法糖注册局部组件components: {'cpn2': {template: `<div><h2>mdzzzzzzzzzzzzzz</h2></div>`}}})</script>

13.6 模板的抽离写法

<body><div id='app'><cpn></cpn></div><template id='cpn2'><div><h2>fuck</h2></div></template><script src="../js/vue.js"></script><script>Vue.component('cpn', {template: '#cpn2'})const app = new Vue({el: '#app',})</script>
</body>

13.7 组件中的数据存放问题

<body><div id='app'><cpn></cpn><cpn></cpn><cpn></cpn></div><template id='cpn'><h2>asd</h2><h2>{{title}}</h2><p>fuck</p></template><script src="../js/vue.js"></script><script>Vue.component('cpn', {template: '#cpn',data() {return {title: 'the title'}}})const app = new Vue({el: '#app'})</script>
</body>

13.8 组件中的data为什么是函数

因为函数有各自的作用域和地址,所以设置成函数能避免组件之间相互影响。

<body><div id='app'><h2>{{message}}</h2><cpn></cpn></div><template id='cpn'><div><h2>当前计数: {{counter}}</h2><button @click='decrement'>-</button><button @click='increment'>+</button></div></template><script src="../js/vue.js"></script><script>Vue.component('cpn', {template: '#cpn',data() {return { counter: 0 }},methods: {increment() {this.counter++},decrement() {this.counter--}}})const app = new Vue({el: '#app',data: {message: 'Hello world!',}})</script>
</body>

13.9 父组件向子组件添加数据

<div id='app'><!-- <h2>{{message}}</h2><cpn v-bind:cmovies='movies' :cmessages='message'></cpn> --><cpn :cmessages='message' :cmovies='movies'></cpn></div><template id='cpn'><div><ul><li v-for='item in cmovies'>{{item}}</li></ul><h2>{{cmessages}}</h2></div></template><script src="../js/vue.js"></script><script>// 父传子,propsconst cpn = {template: '#cpn',// props: ['cmovies', 'cmessages'],props: {// # 类型限制传props//   cmovies: Array,//   cmessages: String,// },// 提供默认值以及必传值cmessages: {type: String,default: 'aaaaa',required: true,},// 类型是对象或者数组时,默认值必须是一个函数cmovies: {type: Array,default() {return []}}},data() {return {}},methods: {}}const app = new Vue({el: '#app',data: {message: 'Hello!',movies: ['海王', '海贼王', '海尔兄弟']},components: {cpn,}})</script>

13.10 props中的驼峰标识

在父组件引用子组件的模板中使用v-bind绑定时,不能用驼峰标识,要将其转换为’-'连接的形式。

<body><div id='app'><cpn :c-info='info'></cpn></div><template id='cpn'><div><h2>{{cInfo}}</h2></div></template><script src="../js/vue.js"></script><script>const cpn = {template: '#cpn',props: {cInfo: {type: Object,dafault: { ss: 'ss' },required: true,},},data() {return {}},methods: {},}const app = new Vue({el: '#app',data: {message: 'Hello world!',info: {name: 'chen',age: 23,color: 'black'},},methods: {},components: {cpn}})</script>
</body>

13.11 组件通信-子传父(自定义事件)

子组件自定义事件、并发射事件,由父组件来监听、接收、处理、显示。

  • 在子组件中,通过$emit()来触发事件
  • 在父组件中,通过v-on来监听子组件事件
<body><!-- 父组件模板 --><div id='app'><cpn @item-clicked='cpnClick'></cpn></div><!-- 子组件模板 --><template id='cpn'><div><button v-for='item in categroies' @click='btnClick(item)'>{{item.name}}</button></div></template><script src='../js/vue.js'></script><script>// 这是子组件const cpn = {template: '#cpn',data() {return {categroies: [{ id: '1', name: '唱' },{ id: '2', name: '跳' },{ id: '3', name: 'rap' },{ id: '4', name: '篮球' },],}},methods: {// 自定义事件,发射自定义事件!btnClick(item) {this.$emit('item-clicked', item)},}}// 这是父组件const app = new Vue({el: '#app',data: {message: 'Hello world!'},methods: {cpnClick(item) {console.log('secceed!!', item);}},// 这是注册子组件components: {cpn,}})</script>
</body>

13.12 父子组件通信案例

<body><div id='app'><h2>{{message}}</h2><cpn v-bind:number1='num1' v-bind:number2='num2' @num1change='num1change' @num2change='num2change'></cpn></div><template id='cpn'><div><h2>props:{{number1}}</h2><h2>data:{{dnumber1}}</h2><!-- <input type='text' v-model='dnumber1'> --><input type="text" v-bind:value='dnumber1' @input='num1Input'><h2>{{number2}}</h2><h2>data:{{dnumber2}}</h2><!-- <input type='text' v-model='dnumber2'> --><input type="text" v-bind:value='dnumber2' @input='num2Input'></div></template><script src="../js/vue.js"></script><script>const app = new Vue({el: '#app',data: {message: 'Hello world!',num1: 1,num2: 0,},methods: {num1change(value) {this.num1 = parseFloat(value)},num2change(value) {this.num2 = parseFloat(value);}},components: {cpn: {template: '#cpn',props: {number1: Number,number2: Number},data() {return {dnumber1: this.number1,dnumber2: this.number2}},methods: {num1Input(event) {this.dnumber1 = event.target.valuethis.$emit('num1change', this.dnumber1)},num2Input(event) {this.dnumber2 = event.target.valuethis.$emit('num2change', this.dnumber2)}}}}})</script>
</body>

13.13 组件访问-父访问子-children-refs

  • refs用得很多,children基本不用
<body><div id='app'><h2>{{message}}</h2><cpn></cpn><cpn></cpn><cpn ref='mark'></cpn><button @click="btnClick">按钮</button></div><template id='cpn'></template><script src="../js/vue.js"></script><script>const cpn = {template: '#cpn',data() {return {name: '我是子组件的name'}},methods: {show() {console.log('show!!!!');}}}const app = new Vue({el: '#app',data: {message: 'Hello World!'},components: {cpn,},methods: {btnClick() {// 1. $children// console.log(this.$children)// for (let item of this.$children) {//   console.log(item.name)//   item.show()// 2. $refs => 对象类型,默认是一个空的对象 ref='item'console.log(this.$refs.mark.name)}}})</script>
</body>

13.14 组件访问-子访问父-parent-root

  • root用得很多,parent基本不用
<body><div id='app'><h2>{{message}}</h2><cpn></cpn></div><template id='cpn'><div><h2>我是子组件</h2><button @click="btnClick">按钮</button><div></template><script src="../js/vue.js"></script><script>const cpn = {template: '#cpn',data() {return {}},methods: {btnClick() {// 1.访问父组件 $parent// console.log(this.$parent)// 2.访问根组件 $rootconsole.log(this.$root)console.log(this.$root.message)}},}const app = new Vue({el: '#app',data: {message: 'Hello world!'},methods: {},components: {cpn,}})</script>
</body>

14. 组件化高级

14.1 slot插槽的基本使用

<body><div id='app'><h2>{{message}}</h2><cpn></cpn><cpn><button>按钮</button></cpn><cpn><span>这是span</span></cpn></div><template id='cpn'><!-- 1.插槽的基本使用 <slot></slot>2.插槽的默认值<slot>button</slot>3.如果有多个值,同时放入到组件中进行替换时,一起作为替换元素--><div><h2>插槽用法测试</h2><p>我是组件</p><slot></slot><!-- 添加默认值 --><!-- <v-slot><button>按钮!</button>按钮!</v-slot> --></div></template><script src="../js/vue.js"></script><script>const cpn = {template: '#cpn',data() {return {}},}const app = new Vue({el: '#app',data: {message: 'Hello World!',},components: {cpn}})</script>
</body>

14.2 具名插槽的使用(v-slot)

  • 新的v-slot用法代替了slot用法,语法和写的位置也都有变化
<body><div id='app'><h2>{{message}}</h2><cpn></cpn><cpn v-slot:center><span>标题</span></cpn><cpn><button slot='right'>按钮</button></cpn></div><template id='cpn'><div><p>这是模板</p><slot name='left'><span></span></slot><slot name='center'><span></span></slot><slot name='right'><span></span></slot></div></template><script src="../js/vue.js"></script><script>const cpn = {template: '#cpn',}const app = new Vue({el: '#app',data: {message: 'Hello world!'},components: {cpn}})</script>
</body>

14.3 什么是编译的作用域

  • 在哪个模板,那么其中的任何变量、数据等等都属于模板本身内部的作用域。
  • 在哪个组件,就用哪个组建的数据。
<body><div id='app'><h2>{{message}}</h2><cpn v-show='isShow'></cpn></div><template id='cpn'><div><h2>这是id为cpn的模板</h2><p v-show='isShow'>你猜这行会不会显示?</p></div></template><script src="../js/vue.js"></script><script>const cpn = {template: '#cpn',data() {return {name: 'chen!',isShow: false}}}const app = new Vue({el: '#app',data: {message: 'Hello world!',isShow: true},components: {cpn}})</script>
</body>

14.4 作用域插槽

父组件替换插槽的标签,但是内容由子组件来提供。
已废弃,用v-slot

15 前端模块化

15.1 es6 模块化实现

导出方式一 :

export {flag, sum
}

导出方式二:

export let num1 = 100

导出函数\类:

export function add(num1, num2) {return num1 + num2
}
export class Person {run() {console.log("在奔跑")}
}

导入export default 中的内容

const address = '北京市'
export default address
// export default 只能有一个

统一全部导入

import * as all from './'

16. webpack的一些配置

// prod.config.js
const UglifyjswebpackPlugin = require('uglifyjs-webpack-plugin')
const webpackMerge = require('webpack-merge')
const baseConfig = require('./base.config')module.exports = webpackMerge(baseConfig, {plugins: [new UglifyjswebpackPlugin()],
})
//dev.config.js
const webpackMerge = require('webpack-merge')
const baseConfig = require('./base.config')module.exports = webpackMerge(baseConfig, {devServer: {contentBase: './dist',inline: true,},
})
//base.config.js
const path = require('path');
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const webpack = require('webpack')
const HtmlwebpackPlugin = require('html-webpack-plugin')
const UglifyjswebpackPlugin = require('uglifyjs-webpack-plugin')module.exports = {entry: './src/main.js',output: {path: path.resolve(__dirname, '../dist'),filename: 'bundle.js',// publicPath: '../dist/',},module: {rules: [{test: /\.css$/,use: ['style-loader', 'css-loader']},{test: /\.less$/,use: [{loader: "style-loader" // creates style nodes from JS strings}, {loader: "css-loader" // translates CSS into CommonJS}, {loader: "less-loader" // compiles Less to CSS}]},{test: /\.(png|jpg|gif)$/,use: [{loader: 'url-loader',options: {limit: 1300,name: 'img/[name].[hash:8].[ext]'},}]},{test: /\.js$/,exclude: /(node_modules|bower_components)/,use: {loader: 'babel-loader',options: {presets: ['es2015']}}},{test: /\.vue$/,use: { loader: 'vue-loader' }}]},plugins: [// 请确保引入这个插件!new VueLoaderPlugin(),new webpack.BannerPlugin('这是我的'),new HtmlwebpackPlugin({template: './src/index.html'}),new UglifyjswebpackPlugin()],devServer: {contentBase: './dist',inline: true,},resolve: {alias: {'vue$': 'vue/dist/vue.esm.js',}}
}

入口文件

import name from './js/info'
// 使用es6的模块化规范
const { add, mul } = require('./js/mathUtils')
// 使用commonjs的模块化规范
console.log(add(20, 30))
console.log(mul(20, 30))
console.log(name)
// 依赖css文件
require('./css/normal.css')
// 依赖less文件
require('./css/special.less')
document.writeln('<h2>Hello</h2>')// 使用Vue进行开发
import Vue from 'vue'
import App from './vue/App.vue'new Vue({el: '#app',template: '<App/>',components: {App}
})

一些用到的package

{"name": "meetwebpack","version": "1.0.0","description": "practice","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","build": "webpack --config ./build/prod.config.js","dev": "webpack-dev-server --open --config ./build/dev.config.js"},"author": "","license": "ISC","dependencies": {"babel-core": "^6.26.3","babel-loader": "^7.1.5","babel-preset-es2015": "^6.24.1","css-loader": "^2.0.2","file-loader": "^3.0.1","html-webpack-plugin": "^3.2.0","less": "^3.9.0","less-loader": "^4.1.0","style-loader": "^0.23.1","uglifyjs-webpack-plugin": "^1.1.1","url-loader": "^1.1.2","vue": "^2.5.21","vue-loader": "^15.4.2","vue-template-compiler": "^2.5.21","webpack": "^3.6.0","webpack-dev-server": "^2.9.3","webpack-merge": "^4.1.5"}
}

17. vue-cli

vue-cli2 中的项目初始化命令

vue init webpack project-name

vue-cli3 中的项目初始化命令

vue creat project-name

17.1 runtimecompiler 和 runtimeonly的区别

runtime-compiler

template => ast => render => vdom => ui

runtime-only
性能更高、代码更少
render => vdom => ui

17.2 vue的配置

vue ui

17.3 箭头函数补充

标准格式

const demo = (item1, item2) => {return item1 + item2
}
const demo = item => console.log(item)

当函数中只有一个参数时,可以省略小括号,当函数中只有一行代码时,可以省略return。

箭头函数中的this:向外层作用域中一层层查找,直到有this的定义。

18. vue-router

18.1 url的hash 和 html5 的history

URL的hash也就是锚点(#),本质上是改变window.location的href属性
我们可以直接赋值location.hash来改变href,而页面不发生刷新
location.hash

history 入栈和出栈

history.pushState({}, '', 'item')```replace 不可返回
```history.replaceState({}, '', 'item')```history.go()方法和history.back()\history.forward()等价
history.go(-1)
history.go(1)

18.2 配置路由相关的信息

import VueRouter from 'vue-router'
import Vue from 'vue'
  1. 通过Vue.use(插件), 安装插件
Vue.use(VueRouter)
  1. 创建VueRouter对象
const routes = [
]
  1. 配路由和组件之间的应用关系
const router = new VueRouter({routes
})
  1. 将router对象传入到 Vue 实例
new Vue({router,render: h => h(App)
}).$mount('#app')

使用vue-router步骤
第一步:创建路由组件
第二步:配置路由映射-组件和路径映射关系
第三步:使用路由

<template><div id="app"><router-view /><div id="nav"><router-link to="/home">Home</router-link> |<router-link to="/about">About</router-link></div></div>
</template>

18.3 router-link的其他属性补充

<router-link> 中的to属性--指定路径
tag属性--指定组建的类型(比如说渲染成button)
<router-link to="/" tag="button" replace>
replace模式不会留下历史记录,所以不能返回

18.4 通过代码的方式修改路径

pushState()方法:

export default {name: 'App',methods: {btnHome () {this.$router.push('/home')},btnAbout () {this.$router.push('/about')}}
}

replace()方法:

export default {name: 'App',methods: {btnHome () {this.$router.replace('/home')},btnAbout () {this.$router.replace('/about')}}
}

解决Vue-cli中进行两次路由切换的坑

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)const VueRouterPush = VueRouter.prototype.push
VueRouter.prototype.push = function push (to) {return VueRouterPush.call(this, to).catch(err => err)
}

以App.vue中的path为主,index.js中的path为配合,其中首字母大小写不做严格限制

btnHome () {this.$router.push('/home')
{path: '/Home',name: 'Home',component: Home
}

像这样也是可以的

18.5 动态路由

动态路由的使用(userId)

{path: '/user/:userId',name: 'User',component: User
}
btnUser () {this.$router.push('/user' + '/' + this.userId)}<template><div><h2>用户界面</h2><p>用户界面的内容</p><p>你的id是:{{userId}}</p></div>
</template><script>
export default {name: 'User',computed: {userId () {return this.$route.params.userId}}
}
</script>

18.6 路由的懒加载

作用:动态加载资源,缩短加载时间,提升用户体验!

const User = () => import('../views/user.vue')
或者
component () => import('./views/Home.vue')

第一种更清晰!

18.7 嵌套路由

{path: '/Home',name: 'Home',component: Home,children: [{path: 'news',component: HomeNews},{path: 'message',component: HomeMessage}]}

然后在home.vue中

<router-link to="/home/news">新闻</router-link>
<router-link to="/home/message">消息</router-link>

18.8 全局导航守卫

{name: 'Profile',path: '/Profile',component: Profile,meta: { title: '档案' }}前置钩子 从from 跳转到 torouter.beforeEach((to, from, next) => {document.title = to.matched[0].meta.titlenext()
})

keep-alive 保持状态,避免被频繁创建与销毁

<keep-alive><router-view />
</keep-alive>

使用keep-alive 之后,activated/deactivated的使用成为可能。

进行排除的方法:

<keep-alive exclude="Profile"><router-view />
</keep-alive>

19. Promise

什么情况下会用到promise?

一般情况下是有异步操作时,需要Promise对这个异步操作进行封装
在执行传入的回调函数时,会传入两个参数,一个叫resolve,一个叫reject,而这两个参数本身又是函数
new => 构造函数(1.保存了一些状态信息 2.执行传入的函数)成功时用resolve 失败时候用rejectnew Promise((resolve, reject) => {setTimeout(() => {// resolve('Hello world')reject('error')}, 1000)}).then((data) => {console.log(data)console.log(data)console.log(data)}).catch((error) => {console.log(error)})或者
new Promise ((resolve, reject) => {setTimeout(() => {resove('Hello world!')}, 1000)
}).then(data => {console.log(data)
}, error => {console.log(error)
})

19.1 Promise 的三种状态

penging:等待状态,比如正在进行网络请求,或者定时器没有到时间。
fullfill:满足状态,当主动调用resolve时,就处于该状态,并且会回调.then()
reject:拒绝状态,当主动调用reject时,就处于该状态,并且会回调.catch()

20. vuex

vuex的基本使用

<template><div id="app"><h2>{{message}}</h2><h2>{{$store.state.counter}}</h2><button @click="addition">+</button><button @click="substraction">-</button><hello-vuex></hello-vuex></div>
</template>
<script>
import HelloVuex from './components/HelloVuex.vue'
export default {name: 'App',data () {return {message: '我是app组件',}},components: {HelloVuex},methods: {addition () {this.$store.commit('increment')},substraction () {this.$store.commit('decrement')}}
}
</script><template><div><h2>{{$store.state.counter}}</h2></div>
</template><script>
export default {name: 'HelloVuex',
}
</script>
Vue.use(Vuex)export default new Vuex.Store({state: {counter: 1000},mutations: {increment (state) {state.counter++},decrement (state) {state.counter--}},actions: {},modules: {}
})

axios的封装

import axios from 'axios'export function request (config) {// return new Promise((resolve, reject) => {const instance = axios.create({baseUrl: 'http://123.207.32.32:8000/api/wh/',timeout: 5000})return instance(config)//   instance(config)//     .then(res => {//       resolve(res)//     })//     .catch(err => {//       reject(err)//     })// })
}import { request } from './network/request.js'request({url: '/home/multidata'
}).then(res => {console.log(res)
}).catch(err => {console.log(err)
})
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. IGMP技术总结

    目录1. IGMP 简介1.1 IGMP 的版本2. IGMPv1 工作机制3. IGMPv2 的改进3.1 查询器选举机制3.2 离开组机制4. IGMPv3 的改进4.1 主机控制能力的增强4.2 查询和报告报文功能的增强1. IGMP 简介IGMP 是Internet Group Management Protocol(互联网组管理协议)的简称。它是TCP/I…...

    2024/4/23 14:19:39
  2. 08:病人排队

    描述 病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:老年人(年龄 >= 60岁)比非老年人优先看病。 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。 非老年人按登记的先后顺序看病。输入 第1行,输入一个小于100的正整数,表…...

    2024/4/23 14:19:45
  3. javaSE内容总结

    文档注释:-- 功能性注释 格式: /** … */ 作用的位置: 1. 类的上方 2. 方法的上方 3. 常量的上方 String类 – 字符串 String对象是不可变的,本质是字符数组 char[] String对象的创建 – 所有的对象都保存在堆中 方式一: new String(“a”) – 保存在堆中 方式二: Strin…...

    2024/5/6 16:14:25
  4. java小记

    抽象类:就是父类不能再new新的对象;不能实例化类,abstract 可以修饰类,也可以修饰方法;抽象类中一定有构造器,便于子类实例化的时候调用;开发中都会提供抽象类的子类,让子类对像实例化; abstract修饰方法:无方法体,public abstract voiddfs();只有方法的声明,无方…...

    2024/4/27 23:31:43
  5. mvn help:system 需要下载maven-clean-plugin或其他插件 但是连接不了远程仓库导致报错

    问题描述 因为需要,想在机器A上搭建maven环境,由于机器A不能接入互联网,所以想把机器B上已有的仓库直接拷贝到A中使用。于是将机器B的整个repository压缩然后复制到机器A中,具体路径C:\.m2\repository。(机器B中可以正确的执行所有mvn命令,因为仓库很全) 然后给机器A中安…...

    2024/5/6 6:33:05
  6. 对jmeter线程数,ramp-Up.循环次数的理解

    刚接触接口测试,自己的理解是这样。不喜勿喷哈。 1.线程数抽象实例化后就是用户数,ramp-Up就是规定所有用户在时间段内把请求发送完(前提是循环次数是1) 2.那么循环是在哪个时间点开始的?循环开始的时间几乎和启动时间相同,也就是说5个线程5秒内启动,循环2次,就是想于第…...

    2024/5/6 11:02:33
  7. C++ STL学习

    一.函数模板和类模板 1.STL:标准模板库 1.函数模板:类型参数化, template<class T> void MySwap(T &a, T& b) {T temp = a;a = b;b = temp;}//MySwap(c, d);//只能输入两个相同类型的数据 //编译器会先选择普通函数,在执行模板函数 void MySwap(char &a,…...

    2024/4/23 14:19:40
  8. 2020-03-26

    List的子类(即实现类)特点: ArrayList: 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector:底层数据结构是数组,查询快,增删慢 线程不安全,效率低 Vevtor的特有功能: 1.添加功能: public void addElement(object obj) ----add() 2.实现功能: public o…...

    2024/5/6 15:16:53
  9. 16.【BeanUtils工具类】

    简化数据封装,用于封装JavaBean的。JavaBean:标准的Java类 要求类必须被public修饰 必须提供空参的构造器 成员变量必须使用private修饰 提供公共setter和getter方法功能:封装数据 属性 和成员变量名不一定相同!如:setter和getter方法截取后的产物getUsername() --> Us…...

    2024/4/23 14:19:38
  10. ROS兼容python2和python3同时使用

    文章目录更新python3.5到python3.7下载解压编译删除原来的软连接添加python3的软链接问题备忘创建虚拟环境,可以运行python3的同时兼容python2创建virtualenv环境NOTE 系统版本:ubuntu16.04 更新python3.5到python3.7 下载 wget https://www.python.org/ftp/python/3.7.1/Pyt…...

    2024/4/23 14:19:37
  11. World Cup Fever-------------------------------------------思维(最短路)

    题意: 有两个队伍,第一支队伍从1号球员开始传球,一直传到N号球员。第二支队伍会阻拦第一支队伍。 请问第一支球队是否能从1号球员传到n号球员 传球:当a和b之间没有人时,可以 传球。 不能传球:当a和b之间存在人时,无法传球 解析: 因为n的范围很小,所以我们枚举每个球员之间…...

    2024/4/15 8:36:46
  12. 追加模式创建的FileOutputStream获取的FileChannel设置position无效

    下面看段代码:@Testpublic void append(){DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm");try {//追加模式创建FileOutputStreamFileOutputStream fos = new FileOutputStream("d:/tmp/1.txt",true);FileChannel fc = fos.getChannel();By…...

    2024/4/17 8:12:04
  13. docker的基本应用

    docker ps 查看docker运行的容器 docker run --name fee -v /etc/localtime:/etc/localtime -v /etc/hosts:/etc/hosts -v /home/java/fee:/opt/fee -v /home/java/fee/logs:/opt/fee/logs --net=host -p 40013:40013 -d openjdk java -jar -Xms1g -Xmx1g /opt/fee/fee.jar 启…...

    2024/4/20 1:24:06
  14. ubuntu获取发行版linux kernel的debug symbol

    有时候碰到了kernel panic,如果stack在linux kernel里,那就需要有linux kernel的debug symbol,如果你的kernel是release的,那就可以直接下载symbol就可以了。1. 从ubuntu keyserver获取keyubuntu 16.04及以后的系统:$sudo apt-key adv --keyserver keyserver.ubuntu.com --…...

    2024/4/17 8:11:46
  15. Python | 全网最简单方式把Python文件打包为exe

    auto-py-to-exe是一个将.py转换为.exe的可视化窗口程序,安装这个程序时会自动安装pyinstaller所需要的运行时依赖文件,通过点击不同的按钮实现不同的pyinstaller指令。 相比于pyinstaller,这个 程序不用去记多种指令。本人在对同一份代码打包的时候发现,pyinstaller会出现&…...

    2024/5/6 8:45:48
  16. Android AndroidX的迁移

    AndroidX 将原始支持库 API 替换为 androidx 命名空间中的软件包。只有软件包和 Maven 工件名称发生了变化;类、方法和字段名称没有变化。注意:我们建议在单独的分支中执行迁移。此外,还应设法避免在执行迁移时重构代码。前提条件执行迁移之前,请先将应用更新到最新版本。我…...

    2024/4/23 14:19:29
  17. 简单题之输出格式练习

    给你一个字符串列表L,用一行代码顺序输出L中的元素,元素之间以一个空格隔开,注意行尾不要有空格,输出单独占一行。 如L=[‘abc’,‘d’,‘efg’], 则输出abc d efg。 L=[abc,d,efg] print( .join(L))...

    2024/4/23 14:19:31
  18. Redis(一):数据结构与实战场景

    首先介绍一下Redis大概的应用场景以及学习思路等一、Redis基本数据结构 1、基本数据结构2、常用指令: 1) String 127.0.0.1:6379> set redisKey redis OK 127.0.0.1:6379> get redisKey "redis"String在redis内部存储默认就是一个字符串,被redisObject所引用…...

    2024/4/17 8:11:40
  19. Java面试题------二叉树重建

    说实话我还是没看懂 收获:1.在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree) 2.一棵深度为k,且有2^k-1个结点的二叉树,称为满二叉树,这种树的特点是每一层上的结点数都是最大结点数 3.在…...

    2024/4/23 14:19:28
  20. StackExchange.Redis加锁机制实例

    1、redis下载安装 Github下载地址:https://github.com/MicrosoftArchive/redis/releases安装过程不做写明1、VS引用StackExchange.Redis通过“工具”=》“库程序包管理器”=》“程序包管理器控制台”pm>Install-Package StackExchange.Redis -Version 1.2.5也可通过vs中NuG…...

    2024/4/23 14:19:24

最新文章

  1. 高性能mysql笔记总结—chapter01

    数据库的逻辑架构 mysql是客户端和服务端的架构&#xff0c;一个客户端占有一个客户端进程的线程连接&#xff0c;线程是会被客户端缓存起来的。 第一层是处理认证和连接 第二层用来解析和优化查询 第三层是用来存储引擎层 特点是存储引擎是可插拔的&#xff0c;也就是说可以替…...

    2024/5/6 17:13:16
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/6 9:38:23
  3. java学习之线程池

    java线程池优点&#xff1a; 降低线程创建和销毁的开销&#xff0c;提高系统性能。 提高线程的利用率和系统的吞吐量。 统一线程的管理和监控&#xff0c;避免线程泄漏和线程安全问题。 支持任务队列和拒绝策略等机制&#xff0c;提供灵活的任务调度和任务处理能力。 并不…...

    2024/4/30 7:48:43
  4. 如何转行成为产品经理?

    转行NPDP也是很合适的一条发展路径&#xff0c;之后从事新产品开发相关工作~ 一、什么是NPDP&#xff1f; NPDP 是产品经理国际资格认证&#xff0c;美国产品开发与管理协会&#xff08;PDMA&#xff09;发起的&#xff0c;是目前国际公认的唯一的新产品开发专业认证&#xff…...

    2024/5/4 23:56:47
  5. WPS二次开发专题:如何获取应用签名SHA256值

    作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 在申请WPS SDK授权版时候需要开发者提供应用包名和签…...

    2024/5/5 8:39:22
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/4 23:54:56
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/4 23:54:56
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/6 9:21:00
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/4 23:55:06
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/4 23:55:01
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57