Vue — 第二天(v-model和过滤器)

VUE-02-v-model和过滤器

昨日反馈与回顾

代码仓库的问题

不要修改你克隆下来的仓库中任意代码,否则,下次pull时,可能会报错,从而得到不到最新的代码。

在这里插入图片描述

如果已经遇到了这个冲突:

  • 解决冲突(git 中解决冲突)
  • 把关键代码拷出来,放弃这个仓库,重新再次clone(后续git pull)

处理样式

样式由两个部分决定:

  • class
  • style

v-bind绑定class

目标:知道通过vue怎么去操作类,也就是class属性的值。

动态绑定class属性,有三种方式:

  • 三元运算符
  • 绑定对象:如果属性值为true,则添加属性名给class
  • 绑定数组

代码:

<style>#app{width:500px;margin:50px auto;border:3px solid red;}.box{border:3px solid black;margin:5px;}.bg-blue{background-color: blue;}.bg-green{background-color: green;}.fs20{font-size:20px;}.tr{text-align: right;}</style>
</head>
<body><div id="app"><h3 class="title">v-bind-绑定class</h3><!-- 元素自有class和v-bind绑定的class会协同工作,一起生效 --><div class="box" v-bind:class="cla ? 'bg-blue': 'bg-green'">1. 三元表达式</div><!-- 如果对象中的属性值是true,则把对象中的属性名添加到类名中 --><div class="box" :class="claObj">2. 绑定对象</div><!-- 数组中元素是字符串,它会把所有的元素全添加到class中 --><div class="box" :class="claArr">3. 绑定数组</div><button @click="hAddClass">补充一个class</button></div><script>// v-bind 是用来动态绑定元素的属性,而class也是元素的属性// 目标: 可以通过动绑定class来控制样式 。// 方式:// 1. 三元表达式// 2. 绑定对象// 3. 绑定数组const vm = new Vue({el: "#app",// el: document.getElementById("app"),data: {cla: false,claObj: {fs20: true,tr: true},claArr:['fs20','tr', 'abc']},methods: {hAddClass () {// 向数组中添加一个类 'c-red'this.claArr.push('c-red')}}})</script>

:class 动态绑定类名 class 原生属性,可以同时存在,他们包含的所有类会合并在一起生效。

v-bind绑定style

目标:知道通过vue怎么去操作行内样式,也就是style属性的值。

动态绑定style属性有两种方式:

  • 对象形式
  • 数组形式

v-bind绑定style使用对象:

<div id="app"><h3 class="title">v-bind-绑定style</h3><!-- 把对象的属性名和属性值直接设置到style中 --><div class="box" :style="styleObj">1. 绑定对象</div><!-- 把数组中的每一个元素(对象),取出来,组成style --><div class="box" :style="styleArr">2. 绑定数组</div><button @click="hBlack">改成黑色的字</button></div><script>// v-bind 是用来动态绑定元素的属性,而style也是元素的属性// 目标: 可以通过动绑定style来控制样式 。// 方式:// 1. 绑定对象// 2. 绑定数组const vm = new Vue({el: "#app",// el: document.getElementById("app"),data: {styleObj: {color:'red',// 如果属性名有-,则要加'''background-color':'blue'},// 数组中的每一项都是一个对象,其中以键值对的格式设置了stylestyleArr:[ {color:'red','font-weight':'bold'}, {'font-size':'50px'} ]},methods: {hBlack () {// 直接把styleObj中的color设置成blackthis.styleObj.color = "black"}}})</script>

如果同时存在 :style 和 style vue操作的样式会覆盖默认样式。

总结:

  • :style 使用对象 {css属性名:css属性值}
  • :style 使用数组 [{css属性名:css属性值}]

v-model

目标

知道如何绑定多种类型的表单元素

基本使用

<div id="app"><h3 class="title">v-model</h3>用户名:<input v-model="userName" ><br><!-- 不是表单元素不能用<div v-model="userName" ></div> --><button @click="userName=123">123</button><button @click="hPrint">打出userName</button></div><script>// v-model // 是用来对表单元素进行双向绑定的。//   表单元素: 用户可以进行交互的元素,textarea,select,input,checkbox...//   双向绑定: //      -1. 用户在input中的修改,会影响到数据//      -2. 数据的修改会影响input// 格式:<表单元素 v-model="数据项">const vm = new Vue({el: "#app",data: {userName: '小王'},methods: {hPrint () {console.log( this.userName )}}})</script>

表单元素

  • 文本域
  • 复选框
  • 单选框
  • 下拉框
<div id="app"><h3 class="title">v-model</h3><div class="box"><!-- 1. 普通文本框  -->用户名:<input v-model="userName" ></div><div class="box"><!-- 2. 单选  由value来决定用户选中的值 -->性别:<input type="radio" value="" v-model="gender">帅哥<input type="radio" value="" v-model="gender">美女</div><div class="box"><!-- 3. 复选  由value来决定用户选中的值,结果放在一个数组中 -->爱好:<input type="checkbox" value="读书" v-model="hobby">读书<input type="checkbox" value="sport" v-model="hobby">运动<input type="checkbox" value="k歌" v-model="hobby">k歌</div><div class="box"><!-- 4. 文本域  注: 不能把内容写在元素中: <textarea v-model="info">abc</textarea>-->个人说明:<textarea v-model="info"></textarea></div><div class="box"><!-- 5. 下拉选中的值是以value为准-->位置: <select  v-model="city"><option value="1">北京</option><option value="2">上海</option><option value="3">潜江</option></select></div><div class="box"><!-- 6. 单个复选框(是否同意)如果为true,则选中,false,不选中-->愿意吗?<input type="checkbox" v-model="isChecked"></div><button @click="hPrint">打印结果</button></div><script>// v-model // 是用来对表单元素进行双向绑定的。// 1. 普通文本框 // 2. 单选// 3. 复选// 4. 文本域// 5. 下拉// 6. 单个复选框(是否同意)const vm = new Vue({el: "#app",data: {userName: '小王子',gender:'男',  // 单选hobby:['读书'], // 多选info: '自我介绍,如下:白玉谁家郎',city: 1,isChecked: false},methods: {hPrint () {console.log( this.userName )console.log( this.gender )console.log( this.hobby )console.log( this.info )console.log( this.city )console.log( this.isChecked )}}})</script>

修饰符

lazy

在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步。你可以添加 lazy 修饰符,从而转为在 change 事件_之后_进行同步:

<!-- 在“change”时而非“input”时更新 -->
<input v-model.lazy="msg">

number

如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符:

<input v-model.number="age" type="number">

这通常很有用,因为即使在 type="number" 时,HTML 输入元素的值也总会返回字符串。如果这个值无法被 parseFloat() 解析,则会返回原始的值。

trim

如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符:

<input v-model.trim="msg">
<div id="app"><h3 class="title">v-model</h3><div class="box"><!-- 1. lazy  --><!-- 不加lazy:<input v-model="userName" >{{userName}} --><br>加lazy:<input v-model.lazy="userName" >{{userName}}</div><div class="box"><!-- 2. number  不加number,就是一个普通的字符串加了number,会尽量帮你转成数值,转不成,也不会报错--><br>加number:<input v-model.number="age" >{{age}}</div><div class="box"><!-- 3. trim  自动把内容中的前后空格去掉--><br><input v-model.trim="email" >内容的长度:{{email.length}}</div></div><script>// v-model //     v-model的三个修饰符// 1. lazy    -->   v-model.lazy="userName"//    默认情况,v-model只要用户修改了input中的内容(在每次input事件之后)就会与数据进行同步//    如果加了lazy之后,则在用户完成了输入,鼠标失焦之后(相当于change),才会与数据同步。// 2. number//    自动转成数值的格式// 3. trim//    把内容中的前后空格去掉const vm = new Vue({el: "#app",data: {userName: '小王',age:18,email:''},methods: {hPrint () {console.log( this.userName )}}})</script>

案例-资产列表

在这里插入图片描述

渲染列表

目标:完成表格列表渲染。

需求:

  • 根据data中的数据,进行tr的渲染。
  • 当没有数据的时候,显示暂无数据。

静态页面:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="./bootstrap.min.css">
</head>
<body><div id="app"><div class="container"><table class="table table-bordered table-hover"><thead><tr><th>编号</th><th>资产名称</th><th>创建时间</th><th>操作</th></tr></thead><tbody><tr><td>1</td><td>宝马</td><td>20000</td><td><a href="#">删除</a></td></tr></tbody></table></div></div>
</body>
</html>

准备数据:

list: [{ id: 1, name: '外套', price: 99 },{ id: 2, name: '裤子', price: 34 },{ id: 3, name: '鞋', price: 25.4 },{ id: 4, name: '头发', price: 19900 }
]

完整的功能实现:

  <div id="app"><div class="container"><table class="table table-bordered table-hover"><thead><tr><th>编号</th><th>资产名称</th><th>创建时间</th><th>操作</th></tr></thead><tbody><!-- <tr v-for="(循环变量,索引变量) in 数据"> --><tr v-for="(item, idx) in list"><td>{{item.id}}</td><td>{{item.name}}</td><!-- 如果价格超过100,就有red这个类 --><!-- <td class="red">{{item.price}}</td> --><!-- 三元--><!-- <td :class='item.price > 100 ? "red" : ""'>{{item.price}}</td> --><!-- 放一个对象如果对象中的属性值是true,则把对象中的属性名添加到类名中--><td :class="{red:item.price>100}">{{item.price}}</td><td><a href="#" @click.prevent="hDel(idx)">删除</a></td></tr></tbody></table></div></div><script src="./vue.js"></script><script>const vm = new Vue({el: '#app',data: {list: [{ id: 1, name: '外套', price: 99 },{ id: 2, name: '裤子', price: 34 },{ id: 3, name: '鞋', price: 25.4 },{ id: 4, name: '头发', price: 19900 }]}})</script>

删除功能

目标:完成表格一行删除。

需求:

  • 点击删除按钮,确认框提示
  • 点击确认后,再进行删除
  • 绑定事件,指定处理函数的时候,传入ID
  • 在处理函数中,根据ID进行删除(id===>index====>根据索引删除)

实现:

<td><a @click.prevent="hDel(idx)" href="#">删除</a></td>
methods: {hDel (index) {console.log('要删除的下标是',index)// 删除数组中指定位置的元素this.list.splice(index, 1)}
}

添加资产

目标:完成表格添加资产。

大致的实现步骤:

  1. 准备一个表单,包含一个输入框,包含一个提交按钮。
  2. 监听提交事件,提取输入框中的内容
  3. 根据输入的内容来组织 资产信息对象 追加到数组中即可
    1. 数据会驱动视图的更新
  4. 清空输入框中的内容

在案例中的代码:

html结构

<!-- 添加资产 -->
<form class="form-inline"><div class="form-group"><div class="input-group"><input type="text" class="form-control" placeholder="资产名称"></div></div>&nbsp;&nbsp;&nbsp;&nbsp;<button class="btn btn-primary">添加资产</button>
</form>

双向绑定输入框

<input v-model.trim="brandName" type="text" class="form-control" placeholder="资产名称">
  • 监听提交事件,且阻止默认提交行为
<form @submit.prevent="addBrand()" class="form-inline">
  • 在处理函数中实现逻辑
        // 添加资产addBrand() {// 通过v-model绑定输入框,可以实时的获取输入的内容// console.log(this.brandName)// 严谨判断,未输入内容,提示 + 阻止程序运行// trim()是去除字符串左右两侧的空格,然后去判断会更加严谨if (!this.brandName.trim()) {return alert('请输入资产名称')}// 组织一个对象:id brandName createTime// 正常逻辑:去除数组中最后一项数据的ID累加1即可// 极端情况:数组中已经没有数据,此时ID为1即可const obj = {id: this.list.length ? this.list[this.list.length - 1].id + 1 : 1,brandName: this.brandName,createTime: new Date()}// 追加到数组中即可this.list.push(obj)// 清空输入框this.brandName = ''}

梳理其它功能

目标:确定还有哪些功能需要完成。

在这里插入图片描述

输入框结构:

      <!-- 搜索 --><form class="form-inline" style="padding: 20px 0"><input type="text" class="form-control" placeholder="输入关键字进行搜索"></form><!-- 表格 -->

过滤器

目标:

  • 理解过滤器的作用和使用场景
  • 掌握定义和使用过滤器。

理解过滤器

过滤器的作用:转换格式。

生活中的过滤器:

如:把水中的杂质过滤掉。输入过滤器的是脏水,输出的是纯净水。

vue中的过滤器:

- 如:把字符串用0补足6位。输入的是不足6位的字符串,输出的是用0补全之后的字符串。
- 如:把单词首字母转成大写。输入的是普通单词,输出的是首字母大写的单词。

本质就是一个函数

格式x ---过滤器---->  格式y

格式

定义过滤器的格式

new Vue({// 过滤器的定义filters: {// 属性名称(过滤器名称):属性的值(过滤器处理函数)myFilter:function(value,其它参数){}}})

使用过滤器的格式

// 不带参数
{{ msg | 过滤器}}
// 带参数
{{ msg | 过滤器(参数)}}

示例1:不带参数的过滤器

<div id="app"><h3>{{msg}}</h3><!-- 使用过滤器 --><h3>{{msg | f1}}</h3><!-- 使用过滤器 --><h3>{{msg | padding6}}</h3></div><script>// vue中的过滤器// 作用: 在显示数据之前,做一次格式转化// 定义格式// filters: {//     过滤器名: function (value,其它参数) {//     }// }// 使用格式 // {{ msg | 过滤器}}// {{msg}}       =====> console.log(msg)// {{msg | f1}}  =====> console.log(   f1(msg)  )const vm = new Vue({el: "#app",data: {msg: 'vue'},// 过滤器列表filters: {// {{msg | f1}}// 会去:// 1. 调用f1这个函数,并自动把msg传进来给value// 2. 把f1函数的返回值显示出来f1 (value) {console.log(value)return 'hahaha'},padding6 (str) {// 对于字符串,不足6位,// 左侧补0// String(str) 类型转换// padStart: 在左侧补足字符串//字符串.padStart(总长度,填充的字符)return String(str).padStart(6, "*")}}})
</script>

注意:

  • 它的工作过程就是函数的调用执行过程。

  • 过滤器本质是一个函数:它的接收的参数是格式化之前的数据及格式化的参数,它的返回值是格式化之间的值

示例2:带参数过滤器

定义:

filters: {// {{msg | f1}}// 会去:// 1. 调用f1这个函数,并自动把msg传进来给value// 2. 把f1函数的返回值显示出来f1 (value) {console.log(value)return 'hahaha'},paddingN (str,n) {// 对于字符串,不足n位,左侧补0// String(str) 类型转换// padStart: 在左侧补足字符串//字符串.padStart(总长度,填充的字符)return String(str).padStart(n, "*")}}

使用:

{{ "ab" | padding6}}
{{ name | padding(5)}}

注意:

  • 它会自动传入第一个参数。

在这里插入图片描述

过滤器的分类

  • 全局过滤器(在vue实例外部定义,在随后的每个vue实例中均可使用)

    Vue.filter('过滤器名称',function(value){ //管道符前js表达式执行结果 // 返回处理好的数据即可 
    })
    
  • 局部过滤器(在vue实例中定义,仅能给当前vue实例管理的视图使用)

总结:

  • 全局 Vue.filter('过滤器名称',(value)=>{ //管道符前js表达式执行结果 // 返回处理好的数据即可 })
  • 局部 new Vue({filters:{'过滤器名称':(value)=>{ //管道符前js表达式执行结果 // 返回处理好的数据即可 }}})

自定义指令

目标:知道如何定义自定义指令,使用自定义指令。

指令(directive)vue提供了v-开头的特殊属性,称之为指令。它提供的指令是有限,如果遇见内置指令无法给你实现的功能,自己封装一个指令(自定义指令)。

定义一个v-focus的指令,作用让input自动获取焦点

全局自定义指令,局部自定义指令

  <div id="app"><input type="text" v-focus><input type="text" v-myfocus></div><script src="./vue.js"></script><script>// 全局自定义指令// Vue.directive('指令的名称','指令配置对象')// 参数1:指令的名称,不包含v-,但是在使用指令的时候需要加上v-// 参数2:指令配置对象,固定属性 inserted 指定的一个函数,//      1. 该函数会在通过指令标记的元素,创建完毕之后执行//      2. 该函数有一个默认参数 el 指的是使用这个指令的元素Vue.directive('focus',{inserted (el) {// 获取焦点el.focus()}})const vm = new Vue({el: '#app',// 局部自定义指令// vue配置对象提供了一个选项:directives 对应 对象directives: {// 属性名称(指令的名称):属性的值(指令的配置对象)myfocus: {inserted (el) {el.style.height = '50px'el.focus()}}}})</script>

补充:

  • dom元素提供了focus函数,dom.focus()触发获取焦点事件,自然元素可以获取焦点。

案例-资产列表(续)

用过滤器完成货币格式化显示

filters: {$:function(value, _currency) {// 全局匹配: 三位连续,且之后也是数值 的数值var digitsRE = /(\d{3})(?=\d)/g;value = parseFloat(value);if (!isFinite(value) || !value && value !== 0) return '';_currency = _currency != null ? _currency : '¥';// 保留两位小数,并整体转成字符串var stringified = Math.abs(value).toFixed(2);// 获取整数部分。-3表示倒数3位的位置var _int = stringified.slice(0, -3);// 整数部分以3为基准长度划分,剩下几位var i = _int.length % 3;// 取出头部。// 如:12345 ----> 12,var head = i > 0 ? _int.slice(0, i) + (_int.length > 3 ? ',' : '') : '';// 取出小数点部分// 如:12345.67 ----> .67var _float = stringified.slice(-3);var sign = value < 0 ? '-' : '';return _currency + sign + head + _int.slice(i).replace(digitsRE, '$1,') + _float;}
}

用自定义指令来完成搜索框自动获取焦点

directives: {// 属性名称(指令的名称):属性的值(指令的配置对象)myfocus: {inserted (el) {el.focus()}}
}

用过滤器完成货币格式化显示。

注意:下面的代码来自vue1中的源码。在vue1中提供了货币金额显示格式化的过滤器currency,请在这里https://cdn.bootcdn.net/ajax/libs/vue/1.0.11/vue.js搜索currency关键字。

在这里插入图片描述

filters: {$:function(value, _currency) {// 全局匹配: 三位连续,且之后也是数值 的数值var digitsRE = /(\d{3})(?=\d)/g;value = parseFloat(value);if (!isFinite(value) || !value && value !== 0) return '';_currency = _currency != null ? _currency : '¥';// 保留两位小数,并整体转成字符串var stringified = Math.abs(value).toFixed(2);// 获取整数部分。-3表示倒数3位的位置var _int = stringified.slice(0, -3);// 整数部分以3为基准长度划分,剩下几位var i = _int.length % 3;// 取出头部。// 如:12345 ----> 12,var head = i > 0 ? _int.slice(0, i) + (_int.length > 3 ? ',' : '') : '';// 取出小数点部分// 如:12345.67 ----> .67var _float = stringified.slice(-3);var sign = value < 0 ? '-' : '';return _currency + sign + head + _int.slice(i).replace(digitsRE, '$1,') + _float;}
}

用自定义指令来完成搜索框自动获取焦点

directives: {// 属性名称(指令的名称):属性的值(指令的配置对象)myfocus: {inserted (el) {el.focus()}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛人iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

概览 随着移动互联网的发展&#xff0c;如今的手机早已不是打电话、发短信那么简单了&#xff0c;播放音乐、视频、录音、拍照等都是很常用的功能。在iOS中对于多媒体的支持是非常强大的&#xff0c;无论是音视频播放、录制&#xff0c;还是对麦克风、摄像头的操作都提供了多套…

Vue — 第三天(计算属性和json-server)

计算属性 使用场景 如果一个结果需要依赖data中的数据&#xff0c;但是需要经过一些逻辑处理&#xff0c;才能得到你想要的数据。此时就可以使用计算属性。 例如&#xff1a;要对给定的字符串做翻转处理之后再来显示。 <div id"app"><!-- 此处逻辑复杂 …

Vue — 第四天(components组件)

问题导入 下面的代码是一个折叠面板的效果。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Docu…

iOS开发常用的RGB色值和宏

iOS中RGB常用的色值,同时可将对颜色的设置定义成宏,方便开发应用,如: // name 颜色相关 // 参数格式为&#xff1a;0xFFFFFF #define kColorWithRGB(rgbValue) \ [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16)) / 255.0 \ …

防火墙综合实验

防火墙技术综合实验 一、实验目的&#xff1a;本次实验是将多种访问控制列表以及防火墙部分的知识做一个汇总 二、实验内容 A&#xff1a;Established控制列表 拓扑图 配置步骤 1:配置各端口ip地址&#xff0c;配置登陆密码 R4: 登陆账号&#xff1a;ys 密码&#xff1a;123 2:…

iOS获取当前设备型号等信息总结 包含iPhone7和iPhone7P

#include <sys/types.h> #include <sys/sysctl.h>//获得设备型号(NSString *)getCurrentDeviceModel {int mib[2];size_t len;char *machine;mib[0] CTL_HW;mib[1] HW_MACHINE;sysctl(mib, 2, NULL, &len, NULL, 0);machine malloc(len);sysctl(mib, 2, mac…

Vue — 第五天(路由)

前端路由 问题导入 在前面完成的资产管理案例中&#xff0c; 我们是把列表区域和添加表单区域实现在了一个区域。当页面功能比较复杂时&#xff0c;我们需要它们拆分开来&#xff1a;一个页面中只显示一个区域。 一个比较直观的解决方案是把它们分别做成两个独立的网页文件&…

Vue — 第六天(vue-cli-介绍)

vue-cli-介绍 vue-cli是官方提供的开发vue项目的脚手架工具。 脚手架是为了保证各施工过程顺利进行而搭设的工作平台。 在开发过程中&#xff0c;脚手架工具是有用的&#xff0c;开发完成&#xff08;项目上线&#xff09;&#xff0c;它就没有用了。 vue-cli可以提供基于vue项…

Vue — 第七天(vue-cli-案例)

资料获取地址&#xff1a; github: https://gitee.com/wang_yu5201314/VUE_vuecli SSH&#xff1a; gitgitee.com:wang_yu5201314/VUE_vuecli.git hero案例-项目介绍 功能介绍&#xff1a; 三个模块 英雄列表(只做这个)装备列表技能列表 英雄列表 列表组件删除功能添加组件编…

postman测试工具

做文件上传测试的时候可以选择输入方式为文件 做文件下载测试的时候&#xff0c;可以选择 转载于:https://www.cnblogs.com/thesun/p/10853226.html

webpack — 概述介绍

webpack概述 webpack是一个流行的前端项目构建工具&#xff08;打包工具&#xff09;&#xff0c;可以解决当前web 开发中所面临的困境。 webpack提供了友好的模块化支持&#xff0c;以及代码压缩混淆、处理js兼容问题、性能优化等强大的功能&#xff0c;从而让程序员把工作的…

彻底解决iOS项目中 _OBJC_CLASS_$_XXXService, referenced from: 的类似问题

这是大家熟悉的开发过程中可能遇到的问题 这是提交源码到appStore不支持64位设备的提示 本人在提交项目到appStore时发生的的错误&#xff0c;提示必须要支持64的设备&#xff0c;然后自己赶紧进行相关的适应&#xff0c;出现了类似标题的问题&#xff0c;解决方法如下: 1、…

THUPCCTSAPIO2019:Far Away

流水账~ THUPC nmdwsmduliu&#xff01; THUPC Day -INF~Day -2 大概就是自己做题和每周两次的考试&#xff0c;lsy和fcw两个外校的来吊打我们qwqqq THUPC Day -1 Z208 长沙->北京 在车上看gzy/tjj/xzz打摆&#xff1f; THUPC Day 0 从火车站出来做地铁的时候和tjj做反了可海…

UIDocumentInteractionController之程序间文档共享

iOS中的沙盒可以让平台更加的安全&#xff0c;这也是沙盒给用户带来的最主要好处。不过由于沙盒的严格限制&#xff0c;导致程序之间共享数据比较麻烦。一般在程序间共享文档可以通过UIDocumentInteractionController类实现通讯。它支持在你的app中用其他app预览和显示文档。同…

c#基础知识梳理(四)

上期回顾 - https://www.cnblogs.com/liu-jinxin/p/10826971.html 一、类 当你定义一个类时&#xff0c;你定义了一个数据类型的蓝图。这实际上并没有定义任何的数据&#xff0c;但它定义了类的名称意味着什么&#xff0c;也就是说&#xff0c;类的对象由什么组成及在这个对象…

UIButton设置圆角和边框及边框颜色

UIButton *testButton [UIButton buttonWithType:UIButtonTypeSystem];[testButton setFrame:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/2, 100,100)];[testButton setTitle:"获取屏幕尺寸" forState:UIControlStateNormal];[testButt…

Objective-C 深复制和浅复制与NSCopying协议

1.简单复制只能实现浅拷贝&#xff1a;指针赋值&#xff0c;使两个指针指向相同的一块内存空间&#xff0c;操作不安全。 2. Foundation类已经遵守了<NSCopying>和 <NSMutableCopying>协议,即实现了copy和mutableCopy方法,因此Foundation对象可以使用这些方法创建对…

NSTimer 进阶使用总结与注意事项

NSTimer 是 iOS 上的一种计时器&#xff0c;通过 NSTimer 对象&#xff0c;可以指定时间间隔&#xff0c;向一个对象发送消息。NSTimer 是比较常用的工具&#xff0c;比如用来定时更新界面&#xff0c;定时发送请求等等。但是在使用过程中&#xff0c;有很多需要注意的地方&…

一步一步教你实现iOS音频频谱动画(一)

如果你想先看看最终效果再决定看不看文章 -> bilibili示例代码下载 第二篇&#xff1a;一步一步教你实现iOS音频频谱动画&#xff08;二&#xff09; 基于篇幅考虑&#xff0c;本次教程分为两篇文章&#xff0c;本篇文章主要讲述音频播放和频谱数据的获取&#xff0c;下篇将…

微信小程序的基础 (一)

微信小程序介绍- 链接 微信小程序&#xff0c;简称小程序&#xff0c;是一种不需要下载安装即可使用的应用&#xff0c;它实现了应用“触手可及”的梦想&#xff0c;用户扫一扫或搜一下即可打开应用 1. 为什么是微信小程序? 微信有海量用户&#xff0c;而且粘性很高&#x…