当前位置: 首页 > 编程日记 > 正文

vue从入门到进阶:指令与事件(二)

一.插值

v-once

通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新。但请留心这会影响到该节点上所有的数据绑定:

span v-once>这个将不会改变: {{ msg }}</span>

v-html

双大括号会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML,你需要使用 v-html 指令:

<p>Using mustaches: {{ rawHtml }}</p>
<p>Using v-html directive: <span v-html="rawHtml"></span></p>

这个 span 的内容将会被替换成为属性值 rawHtml,直接作为 HTML——会忽略解析属性值中的数据绑定。

你的站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击。请只对可信内容使用 HTML 插值,绝不要对用户提供的内容使用插值。

使用 JavaScript 表达式

Vue.js 都提供了完全的 JavaScript 表达式支持。

{{ number + 1 }}{{ ok ? 'YES' : 'NO' }}{{ message.split('').reverse().join('') }}<div v-bind:id="'list-' + id"></div>

这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析。有个限制就是,每个绑定都只能包含单个表达式,所以下面的例子都不会生效

<!-- 这是语句,不是表达式 -->
{{ var a = 1 }}<!-- 流控制也不会生效,请使用三元表达式 -->
{{ if (ok) { return message } }}

二.v-bind与v-on的缩写

v-bind 缩写

<!-- 完整语法 -->
<a v-bind:href="url"></a><!-- 缩写 -->
<a :href="url"></a><!-- 完整语法 -->
<button v-bind:disabled="isButtonDisabled">Button</button><!-- 缩写 -->
<button :disabled="isButtonDisabled">Button</button>

说明下:如果isButtonDisabled的值是 nullundefinedfalse,则 disabled 特性甚至不会被包含在渲染出来的 <button> 元素中。

v-on 缩写

<!-- 完整语法 -->
<a v-on:click="doSomething">...</a><!-- 缩写 -->
<a @click="doSomething">...</a>

三.条件渲染

v-if

<h1 v-if="ok">Yes</h1>

在 <template> 元素上使用 v-if

<template v-if="ok"><h1>Title</h1><p>Paragraph 1</p><p>Paragraph 2</p>
</template>

v-else

你可以使用 v-else 指令来表示 v-if 的“else 块”:

<div v-if="Math.random() > 0.5">Now you see me
</div>
<div v-else>Now you don't
</div>

v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。

v-else-if

<div v-if="type === 'A'">A
</div>
<div v-else-if="type === 'B'">B
</div>
<div v-else-if="type === 'C'">C
</div>
<div v-else>Not A/B/C
</div>

用 key 管理可复用的元素

Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做除了使 Vue 变得非常快之外,还有其它一些好处。例如,如果你允许用户在不同的登录方式之间切换:

<template v-if="loginType === 'username'"><label>Username</label><input placeholder="Enter your username">
</template>
<template v-else><label>Email</label><input placeholder="Enter your email address">
</template>

那么在上面的代码中切换 loginType 将不会清除用户已经输入的内容。因为两个模板使用了相同的元素,<input> 不会被替换掉——仅仅是替换了它的 placeholder

这样也不总是符合实际需求,所以 Vue 为你提供了一种方式来表达“这两个元素是完全独立的,不要复用它们”。只需添加一个具有唯一值的 key 属性即可:

<template v-if="loginType === 'username'"><label>Username</label><input placeholder="Enter your username" key="username-input">
</template>
<template v-else><label>Email</label><input placeholder="Enter your email address" key="email-input">
</template>

现在,每次切换时,输入框都将被重新渲染。注意,<label> 元素仍然会被高效地复用,因为它们没有添加 key 属性。

v-show

<h1 v-show="ok">Hello!</h1>

不同的是带有 v-show 的元素始终会被渲染并保留在 DOM 中。v-show 只是简单地切换元素的 CSS 属性 display

注意,v-show 不支持 <template> 元素,也不支持 v-else。

v-if vs v-show

一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。

v-if 与 v-for 一起使用

v-ifv-for 一起使用时,v-for 具有比 v-if 更高的优先级

四.列表渲染v-for

一个数组的v-for

<ul id="example-1"><li v-for="item in items">{{ item.message }}</li>
</ul>var example1 = new Vue({el: '#example-1',data: {items: [{ message: 'Foo' },{ message: 'Bar' }]}
})

在 v-for 块中,我们拥有对父作用域属性的完全访问权限。v-for 还支持一个可选的第二个参数为当前项的索引。

<ul id="example-2"><li v-for="(item, index) in items">{{ parentMessage }} - {{ index }} - {{ item.message }}</li>
</ul>var example2 = new Vue({el: '#example-2',data: {parentMessage: 'Parent',items: [{ message: 'Foo' },{ message: 'Bar' }]}
})

结果:

Parent - 0 - Foo
Parent - 1 - Bar

你也可以用 of 替代 in 作为分隔符,因为它是最接近 JavaScript 迭代器的语法:

<div v-for="item of items"></div>

一个对象的 v-for

<ul id="v-for-object" class="demo"><li v-for="value in object">{{ value }}</li>
</ul>new Vue({el: '#v-for-object',data: {object: {firstName: 'John',lastName: 'Doe',age: 30}}
})

结果:

John
Doe
30

你也可以提供第二个的参数为键名:

<div v-for="(value, key) in object">{{ key }}: {{ value }}
</div>

结果:

firstName: John
lastName: Doe
age: 30

第三个参数为索引:

<div v-for="(value, key, index) in object">{{ index }}. {{ key }}: {{ value }}
</div>

在遍历对象时,是按 Object.keys() 的结果遍历,但是不能保证它的结果在不同的 JavaScript 引擎下是一致的。

key

为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性。理想的 key 值是每项都有的且唯一的 id。

<div v-for="item in items" :key="item.id"><!-- 内容 -->
</div>

建议尽可能在使用 v-for 时提供 key,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。

数组更新检测

变异方法与替换数组

Vue.js 包装了被观察数组的变异方法,故它们能触发视图更新。被包装的方法有:push(), pop(), shift(), unshift(), splice(), sort(), reverse()

你打开控制台,然后用前面例子的 items 数组调用变异方法:example1.items.push({ message: 'Baz' })

变异方法 (mutation method),顾名思义,会改变被这些方法调用的原始数组。相比之下,也有非变异 (non-mutating method) 方法,例如:filter(), concat()slice() 。这些不会改变原始数组,但总是返回一个新数组。当使用非变异方法时,可以用新数组替换旧数组:

example1.items = example1.items.filter(function (item) {return item.message.match(/Foo/)
})

注意事项

由于 JavaScript 的限制,Vue 不能检测以下变动的数组:

  • 当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
  • 当你修改数组的长度时,例如:vm.items.length = newLength

为了解决第一类问题,以下两种方式都可以实现和 vm.items[indexOfItem] = newValue 相同的效果,同时也将触发状态更新:

// Vue.set
Vue.set(example1.items, indexOfItem, newValue)
// Array.prototype.splice
example1.items.splice(indexOfItem, 1, newValue)

为了解决第二类问题,你可以使用 splice:

example1.items.splice(newLength)

对象更改检测注意事项

还是由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除:

var vm = new Vue({data: {a: 1}
})
// `vm.a` 现在是响应式的

vm.b = 2
// `vm.b` 不是响应式的

对于已经创建的实例,Vue 不能动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, key, value) 方法向嵌套对象添加响应式属性。例如,对于:

ar vm = new Vue({data: {userProfile: {name: 'Anika'}}
})

你可以添加一个新的 age 属性到嵌套的 userProfile 对象:

Vue.set(vm.userProfile, 'age', 27)

你还可以使用 vm.$set 实例方法,它只是全局 Vue.set 的别名:

vm.$set(this.userProfile, 'age', 27)

有时你可能需要为已有对象赋予多个新属性,比如使用 Object.assign() _.extend()。在这种情况下,你应该用两个对象的属性创建一个新的对象。所以,如果你想添加新的响应式属性,不要像这样:

Object.assign(this.userProfile, {age: 27,favoriteColor: 'Vue Green'
})

你应该这样做:

this.userProfile = Object.assign({}, this.userProfile, {age: 27,favoriteColor: 'Vue Green'
})

显示过滤/排序结果

有时,我们想要显示一个数组的过滤或排序副本,而不实际改变或重置原始数据。在这种情况下,可以创建返回过滤或排序数组的计算属性。

<li v-for="n in evenNumbers">{{ n }}</li>data: {numbers: [ 1, 2, 3, 4, 5 ]
},
computed: {evenNumbers: function () {return this.numbers.filter(function (number) {return number % 2 === 0})}
}

在计算属性不适用的情况下 (例如,在嵌套 v-for 循环中) 你可以使用一个 method 方法:

<li v-for="n in even(numbers)">{{ n }}</li>data: {numbers: [ 1, 2, 3, 4, 5 ]
},
methods: {even: function (numbers) {return numbers.filter(function (number) {return number % 2 === 0})}
}

值域 v-for

<div><span v-for="n in 10">{{ n }} </span>
</div>

template-v-for

<ul><template v-for="item in items"><li>{{ item.msg }}</li><li class="divider"></li></template>
</ul>

一个组件的 v-for

<my-component v-for="item in items" :key="item.id"></my-component>

2.2.0+ 的版本里,当在组件中使用 v-for 时,key 现在是必须的。

然而,任何数据都不会被自动传递到组件里,因为组件有自己独立的作用域。为了把迭代数据传递到组件里,我们要用 props

<my-componentv-for="(item, index) in items"v-bind:item="item"v-bind:index="index"v-bind:key="item.id"
></my-component>

不自动将 item 注入到组件里的原因是,这会使得组件与 v-for 的运作紧密耦合。明确组件数据的来源能够使组件在其他场合重复使用

<div id="todo-list-example"><inputv-model="newTodoText"v-on:keyup.enter="addNewTodo"placeholder="Add a todo"><ul><liis="todo-item"v-for="(todo, index) in todos"v-bind:key="todo.id"v-bind:title="todo.title"v-on:remove="todos.splice(index, 1)"></li></ul>
</div>

注意这里的 is="todo-item" 属性。这种做法在使用 DOM 模板时是十分必要的,因为在 <ul> 元素内只有 <li> 元素会被看作有效内容。这样做实现的效果与 <todo-item> 相同,但是可以避开一些潜在的浏览器解析错误。

Vue.component('todo-item', {template: '\<li>\{{ title }}\<button v-on:click="$emit(\'remove\')">X</button>\</li>\',props: ['title']
})new Vue({el: '#todo-list-example',data: {newTodoText: '',todos: [{id: 1,title: 'Do the dishes',},{id: 2,title: 'Take out the trash',},{id: 3,title: 'Mow the lawn'}],nextTodoId: 4},methods: {addNewTodo: function () {this.todos.push({id: this.nextTodoId++,title: this.newTodoText})this.newTodoText = ''}}
})

v-for 与 v-if

当它们处于同一节点,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中。当你想为仅有的一些项渲染节点时,这种优先级的机制会十分有用,如下:

<li v-for="todo in todos" v-if="!todo.isComplete">{{ todo }}
</li>

上面的代码只传递了未完成的 todos。

而如果你的目的是有条件地跳过循环的执行,那么可以将 v-if 置于外层元素 (或 <template>)上。如:

<ul v-if="todos.length"><li v-for="todo in todos">{{ todo }}</li>
</ul>
<p v-else>No todos left!</p>

五.事件处理

事件处理方法

<div id="example-2"><!-- `greet` 是在下面定义的方法名 --><button v-on:click="greet">Greet</button>
</div>
var example2 = new Vue({el: '#example-2',data: {name: 'Vue.js'},// 在 `methods` 对象中定义方法
  methods: {greet: function (event) {// `this` 在方法里指向当前 Vue 实例alert('Hello ' + this.name + '!')// `event` 是原生 DOM 事件if (event) {alert(event.target.tagName)}}}
})// 也可以用 JavaScript 直接调用方法
example2.greet() // => 'Hello Vue.js!'

内联处理器中的方法

<div id="example-3"><button v-on:click="say('hi')">Say hi</button><button v-on:click="say('what')">Say what</button>
</div>new Vue({el: '#example-3',methods: {say: function (message) {alert(message)}}
})

有时也需要在内联语句处理器中访问原始的 DOM 事件。可以用特殊变量 $event 把它传入方法:

<button v-on:click="warn('Form cannot be submitted yet.', $event)">Submit
</button>// ...
methods: {warn: function (message, event) {// 现在我们可以访问原生事件对象if (event) event.preventDefault()alert(message)}
}

事件修饰符

修饰符是由点开头的指令后缀来表示的。

  • .stop
  • .prevent
  • .capture
  • .self
  • .once
<!-- 阻止单击事件继续传播 -->
<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>

使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 @click.prevent.self 会阻止所有的点击,而 @click.self.prevent 只会阻止对元素自身的点击。

<!-- 点击事件将只会触发一次 2.1.4 新增-->
<a v-on:click.once="doThis"></a>

不像其它只能对原生的 DOM 事件起作用的修饰符,.once 修饰符还能被用到自定义的组件事件上。

<!-- the scroll event will not cancel the default scroll behavior 2.3.0 新增 -->
<div v-on:scroll.passive="onScroll">...</div>

Vue 为这些修饰符额外提供了 .passive 修饰符来提升移动端的性能。举个例子,在滚动的时候,浏览器会在整个事件处理完毕之后再触发滚动,因为浏览器并不知道这个事件是否在其处理函数中被调用了 event.preventDefault().passive 修饰符用来进一步告诉浏览器这个事件的默认行为不会被取消。

不要把 .passive 和 .prevent 一起使用。被动处理函数无法阻止默认的事件行为。

按键修饰符

<!-- 只有在 keyCode 是 13 时调用 vm.submit() -->
<input v-on:keyup.13="submit">
<!-- 同上 -->
<input v-on:keyup.enter="submit">
<!-- 缩写语法 -->
<input @keyup.enter="submit">

全部的按键别名:

  • .enter
  • .tab
  • .delete (捕获“删除”和“退格”键)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right

可以通过全局 config.keyCodes 对象自定义按键修饰符别名:

// 可以使用 `v-on:keyup.f1`
Vue.config.keyCodes.f1 = 112

自动匹配按键修饰符(2.5.0 新增)

你也可直接将 KeyboardEvent.key 暴露的任意有效按键名转换为 kebab-case 来作为修饰符:

<input @keyup.page-down="onPageDown">

在上面的例子中,处理函数仅在 $event.key === 'PageDown' 时被调用。

有一些按键 (.esc 以及所有的方向键) 在 IE9 中有不同的 key 值, 如果你想支持 IE9,它们的内置别名应该是首选。

系统修饰键(2.1.0 新增)

可以用如下修饰符来实现仅在按下相应按键时才触发鼠标或键盘事件的监听器。

  • .ctrl
  • .alt
  • .shift
  • .meta

注意:在 Mac 系统键盘上,meta 对应 command 键 (⌘)。在 Windows 系统键盘 meta 对应 Windows 徽标键 (⊞)。在 Sun 操作系统键盘上,meta 对应实心宝石键 (◆)。在其他特定键盘上,尤其在 MIT 和 Lisp 机器的键盘、以及其后继产品,比如 Knight 键盘、space-cadet 键盘,meta 被标记为“META”。在 Symbolics 键盘上,meta 被标记为“META”或者“Meta”。

<!-- Alt + C -->
<input @keyup.alt.67="clear"><!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>

请注意修饰键与常规按键不同,在和 keyup 事件一起用时,事件触发时修饰键必须处于按下状态。换句话说,只有在按住 ctrl 的情况下释放其它按键,才能触发 keyup.ctrl。而单单释放 ctrl 也不会触发事件。

.exact 修饰符(2.5.0 新增)

.exact 修饰符允许你控制由精确的系统修饰符组合触发的事件。

<!-- 即使 Alt 或 Shift 被一同按下时也会触发 -->
<button @click.ctrl="onClick">A</button><!-- 有且只有 Ctrl 被按下的时候才触发 -->
<button @click.ctrl.exact="onCtrlClick">A</button><!-- 没有任何系统修饰符被按下的时候才触发 -->
<button @click.exact="onClick">A</button>

鼠标按钮修饰符(2.1.0 新增)

  • .left
  • .right
  • .middle

这些修饰符会限制处理函数仅响应特定的鼠标按钮。

六.表单输入绑定v-model

你可以用 v-model 指令在表单 <input> <textarea> 元素上创建双向数据绑定。

v-model 会忽略所有表单元素的 valuecheckedselected 特性的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data 选项中声明初始值。

对于需要使用输入法 (如中文、日文、韩文等) 的语言,你会发现 v-model 不会在输入法组合文字过程中得到更新。如果你也想处理这个过程,请使用 input 事件。

文本

<input v-model="message" placeholder="edit me">
<p>Message is: {{ message }}</p>

多行文本

<span>Multiline message is:</span>
<p style="white-space: pre-line;">{{ message }}</p>
<br>
<textarea v-model="message" placeholder="add multiple lines"></textarea>

在文本区域插值 (<textarea></textarea>) 并不会生效,应用 v-model 来代替。

复选框

单个复选框,绑定到布尔值:

<input type="checkbox" id="checkbox" v-model="checked">
<label for="checkbox">{{ checked }}</label>

多个复选框,绑定到同一个数组:

<div id='example-3'><input type="checkbox" id="jack" value="Jack" v-model="checkedNames"><label for="jack">Jack</label><input type="checkbox" id="john" value="John" v-model="checkedNames"><label for="john">John</label><input type="checkbox" id="mike" value="Mike" v-model="checkedNames"><label for="mike">Mike</label><br><span>Checked names: {{ checkedNames }}</span>
</div>
new Vue({el: '#example-3',data: {checkedNames: []}
})

看下面一个例子:

<inputtype="checkbox"v-model="toggle"true-value="yes"false-value="no"
>
// 当选中时
vm.toggle === 'yes'
// 当没有选中时
vm.toggle === 'no'

这里的 true-value false-value 特性并不会影响输入控件的 value 特性,因为浏览器在提交表单时并不会包含未被选中的复选框。如果要确保表单中这两个值中的一个能够被提交,(比如“yes”或“no”),请换用单选按钮。

单选按钮

<div id="example-4"><input type="radio" id="one" value="One" v-model="picked"><label for="one">One</label><br><input type="radio" id="two" value="Two" v-model="picked"><label for="two">Two</label><br><span>Picked: {{ picked }}</span>
</div>
new Vue({el: '#example-4',data: {picked: ''}
})

选择框

单选时:

<div id="example-5"><select v-model="selected"><option disabled value="">请选择</option><option>A</option><option>B</option><option>C</option></select><span>Selected: {{ selected }}</span>
</div>
new Vue({el: '...',data: {selected: ''}
})

如果 v-model 表达式的初始值未能匹配任何选项,<select> 元素将被渲染为“未选中”状态。在 iOS 中,这会使用户无法选择第一个选项。因为这样的情况下,iOS 不会触发 change 事件。因此,更推荐像上面这样提供一个值为空的禁用选项。

多选时 (绑定到一个数组):

<div id="example-6"><select v-model="selected" multiple style="width: 50px;"><option>A</option><option>B</option><option>C</option></select><br><span>Selected: {{ selected }}</span>
</div>new Vue({el: '#example-6',data: {selected: []}
})

v-for 渲染的动态选项:

<select v-model="selected"><option v-for="option in options" v-bind:value="option.value">{{ option.text }}</option>
</select>
<span>Selected: {{ selected }}</span>new Vue({el: '...',data: {selected: 'A',options: [{ text: 'One', value: 'A' },{ text: 'Two', value: 'B' },{ text: 'Three', value: 'C' }]}
})

修饰符.lazy,.number,.trim

.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 输入元素的值也总会返回字符串。

.trim

<input v-model.trim="msg">

相关文章:

【ubuntu工具】bless:二进制查看工具,类似win下的UltraEdit

###安装 sudo apt-get install bless 使用 bless filename 或者执行bless&#xff0c;在图形界面中打开准备操作的文件 工具主界面

马斯克连发三推,发布退出OpenAI内情

整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;美国时间 2 月 17 日&#xff0c;特斯拉 CEO 马斯克在 Twitter 连发三帖&#xff0c;道出自己退出人工智能研究组织 OpenAI的缘由。他在推文中表示&#xff0c;他已经有一年多时间没有深度参与 OpenAI 事务…

开发代码命名规范!

今天查看以前的资料看见代码命名规范。呵呵 就拿出来给大家分享以下&#xff0c;还是比较老的。估计现在也是这种开发的命名规范。仅供参考&#xff01;谢谢。 1.用Pascal规则来命名方法和类型。 public class DataGrid { public void DataBind() {…

【linux命令】readelf工具中英文说明

简介 readelf命令用来显示一个或者多个elf格式的目标文件的信息&#xff0c;可以通过它的选项来控制显示哪些信息。 ELF文件由4部分组成&#xff0c;分别是ELF头&#xff08;ELF header&#xff09;、程序头表&#xff08;Program header table&#xff09;、节&#xff08;Se…

再见Python!Yann LeCun警告:深度学习需要新编程语言

整理 | 一一出品 | AI科技大本营尽管工程师们普遍定位 Python 是简单、优雅的编程语言&#xff0c;但它并非毫无缺点&#xff0c;比如人们一直吐槽它的执行速度不够快&#xff0c;线程不能利用多 CPU 等缺点&#xff0c;如今 AI 界泰斗也放话说要用新编程语言替代 Python。Face…

Linux系统与我之间的故事

2019独角兽企业重金招聘Python工程师标准>>> 说起Linux想必大家都不是很陌生的&#xff0c;关注这方面的不是大神就是对Linux特别热爱的人&#xff0c;那么接下来我给大家介绍下我和Linux之间的一些事&#xff0c;还有如何去快速的学习Linux。 我接触Linux大概就是大…

Google Instant 瞬时搜索上手指南

Google Instant是Google刚刚发布的一种新的搜索方式&#xff0c;随着你在搜索框里输入文字&#xff0c;Google将同时给出搜索结果&#xff0c;同时在搜索框里还会根据你输入的关键字给出搜索建议&#xff0c;通过上下键即可切换。按TAB键可自动补全第一位的搜索建议。随着你不断…

【视频】显示器固定参数struct fb_fix_screeninfo中char id[16]说明

imx6q关于fb和video的设备信息 设备节点 root@myzr:/unit_tests# ls /dev/fb* -l lrwxrwxrwx 1 root root 3 Jan 1 1970 /dev/fb -> fb0 crw-rw---- 1 root video 29, 0 Jan 1 1970 /dev/fb0 crw-rw---- 1 root video 29, 1 Jan 1 1970 /dev/fb1 crw-rw---- 1 …

“编程不规范,同事两行泪!”

【编者按】编程江湖中一直盛传着一个段子&#xff0c;那就是要问程序员最讨厌哪 4 件事&#xff1f;那必须是&#xff1a;写注释、写文档、别人不写注释、别人不写文档。更甚者&#xff0c;在《流浪地球》形成刷屏之势之后&#xff0c;仿其而出的“代码千万行&#xff0c;注释第…

记一次 调节有音量界面 上移的bug

如图所示&#xff1a;音量调节的界面直接上移了本来是以为是因为edittext 的原因使得这个界面上移了&#xff08;但其实我也不信&#xff0c;因为我应该影响不了系统的界面&#xff09; 然后最后不断调整布局 不断调整代码 通过排查 发现是因为使用了DTMF的原因&#xff08;用来…

这可能是史上最全的Python算法集!

来源 | CSDN&#xff08;ID&#xff1a;CSDNnews &#xff09;本文是一些机器人算法&#xff08;特别是自动导航算法&#xff09;的Python代码合集。其主要特点有以下三点&#xff1a;选择了在实践中广泛应用的算法&#xff1b;依赖最少&#xff1b;容易阅读&#xff0c;容易理…

Emoji表情图标在iOS与PHP之间通信及MySQL存储

在某个 iOS 项目中&#xff0c;需要一个服务器来保存一些用户数据&#xff0c;例如用户信息、评论等&#xff0c;我们的服务器端使用了 PHPMySQL 的搭配。在测试过程中我们发现&#xff0c;用户在 iOS 端里输入了 Emoji 表情提交到服务器以后&#xff0c;PHP 无法在 MySQL 数据…

【linux】图形界面基础知识(X、X11、GNOME、Xorg、KDE的概念和它们之间的关系)

转载自&#xff1a;https://blog.csdn.net/zhangxinrun/article/details/7332049 简介 LINUX初学者经常分不清楚linux和X之间&#xff0c;X和Xfree86之间&#xff0c;X和KDE&#xff0c;GNOME等之间是什么关系。常常混淆概念&#xff0c;本文以比较易于理解的方式来解释X&…

DreamWeaver做ASP 第13页

第七步&#xff1a;修改资料篇 修改资料&#xff01;首先要清醒一点&#xff0c;什么人才可以修改。 一&#xff0c;本人只能修改自己的&#xff1b;二&#xff0c;管理员可以修改所有人的。 那今天先来搞个可以修改自己资料的页面。 顺序是&#xff1a;先确认是正确登录&#…

【linux命令】setterm控制终端属性命令(中英文)

###setterm中文 SETTERM(1) 用户命令 SETTERM(1) 名字 setterm - 设置终端属性 概要 setterm [选项] 描述 setterm向终端写一个字符串到标准输出&#xff0c;调用终端的特定功能。在虚拟终端上使用&#xff0c;将会改变虚拟终端的输出特性。不支持的选项将被忽略。 选项 对…

搜狗分身技术再进化,让AI合成主播“动”起来

整理 | 一一出品 | AI科技大本营去年 11 月的互联网大会期间&#xff0c;搜狗与新华社联合发布全球首个AI合成主播一经亮相&#xff0c;引起了人们对“AI媒体”的广泛讨论。如今&#xff0c;搜狗 AI 合成主播不断更新迭代。2 月 19 日&#xff0c;在新华社新媒体中心与搜狗公司…

Angular http跨域

var app angular.module(Mywind,[ui.router]); app.controller(Myautumn,function($scope,$http,$filter){ //$http跨域 //服务端设置 // 访问权限 response.setHeader("Access-Control-Allow-Origin", "*"); // 访问类型 response.setHeader(&q…

文本分类step by step(二)

&#xff08;注&#xff1a;如有转载请标明作者&#xff1a;finallyliuyu, 和出处&#xff1a;博客园&#xff09; 《文本分类 step by step(一)》 在《文本分类step by step&#xff08;一&#xff09;》中&#xff0c;我们从处理语料库开始讲起&#xff0c;一直讲到利用分类器…

Centos7.4 版本环境下安装Mysql5.7操作记录

Centos7.x版本下针对Mysql的安装和使用多少跟之前的Centos6之前版本有所不同的&#xff0c;废话就不多赘述了&#xff0c;下面介绍下在centos7.x环境里安装mysql5.7的几种方法&#xff1a;一、yum方式安装 Centos7.x版本下针对Mysql的安装和使用多少跟之前的Centos6之前版本有所…

叫你一声“孙悟空”,敢答应么?

整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;随着自然语言理解等技术的发展&#xff0c;对话机器人如今盛行&#xff0c;而基于此的智能音箱产品的发展也异常火热。很多开发者一般热衷于在一些对话机器人平台上开发相应的语音技能&#xff0c;但也有不…

【linux】Matchbox(一):启动脚本

脚本执行顺序 启动X服务器 /etc/rc5.d/S01xserver-nodm --> …/init.d/xserver-nodm–> 对应进程&#xff1a; /bin/sh /etc/rc5.d/S01xserver-nodm start background xinit /etc/X11/Xsession–> 对应进程&#xff1a; xinit /etc/X11/Xsession – /usr/bin/Xorg …

java试用(1)hello world

设置环境变量path H:\soft\j2sdk1.4.2_17\bin;H:\soft\eclipse;%path%set CLASSPATH.;H:\soft\j2sdk1.4.2_17\jre\lib;JAVA_HOME: D:\jdk1.5.0PATH: D:\jdk1.5.0\bin;编写程序 Noname1.java (注意&#xff1a;文件名要和class名一样)class Noname1 { public static void…

GAN性能不稳?这九大技术可“镇住”四类缺陷

作者 | Bharath Raj译者 | ang010ela编辑 | 一一出品 | AI科技大本营尽管 GAN 领域的进步令人印象深刻&#xff0c;但其在应用过程中仍然存在一些困难。本文梳理了 GAN 在应用过程中存在的一些难题&#xff0c;并提出了最新的解决方法。使用 GAN 的缺陷众所周知&#xff0c;GAN…

java正则表达式获取指定两个字符串之间内容

xml解析利用正则表达式获取指定两个字符串之间内容 在遇到解析复杂xml的时候&#xff0c;想到大家所想到的都是利用dom4j作为首发工具&#xff0c;但是当遇到层次很多&#xff0c;较为复杂&#xff0c;我们难道还需要从根节点一层一层的解析下去吗&#xff1f;此时不仅代码繁琐…

【linux】Matchbox(二):基本概念

X server X server是Linux系统里面图形接口服务器的简称。Windows系统的界面是这个系统不可分割的一部分&#xff0c;各种窗口操作界面显示都是由系统核心直接管理的&#xff0c;而Linux的图形界面并不是系统的必要组成部分&#xff0c;它可以在无界面的条件下运行。当需要Lin…

Android 控件之ImageSwitcher图片切换器

ImageSwitcher是Android中控制图片展示效果的一个控件&#xff0c;如&#xff1a;幻灯片效果...&#xff0c;颇有感觉啊。做相册一绝 源码下载 一、重要方法 setImageURI(Uri uri)&#xff1a;设置图片地址 setImageResource(int resid)&#xff1a;设置图片资源库 setImageDra…

【Qt】Qt5.x移植后的环境配置(imx6)

1、环境配置脚本如下 #!/bin/shexport QTDIR=/usr/lib/qt5 export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins export QT_QPA_PLATFORM=eglfs:fb=/dev/fb0 export QT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event1 export QT_QPAFONTDIR=/usr/lib/fonts export QML2_IM…

程序员如何避免“滴滴式裁员”悲剧?

作者 | 徐麟转载自数据森麟&#xff08;ID:shujusenlin&#xff09;滴滴于2月15日正式发表裁员公告&#xff0c;想必很多互联网人的朋友圈都已经被这条消息刷屏了&#xff0c;其中最常见的莫过于下面这张图了&#xff1a;此图一出&#xff0c;广大互联网吃瓜群众不禁后背发凉&a…

windows服务搭建及命令总结

1、图解FTP服务器搭建(Windows Server 2008) https://wenku.baidu.com/view/803bdc1759eef8c75fbfb361.html?fromsearch https://www.cnblogs.com/john2017/p/6269671.html 2、WindowsServer2008下搭建ApachePHPMySQL https://wenku.baidu.com/view/2e82b99ea1116c175f0e7cd18…

Linux下的CST和UTC时间的区别

在linux中&#xff0c;用date查看时间的时候显示&#xff1a;2008年 12月 17日 星期三 09:04:14 CSTCST China Standard Time UTC8:00 中国沿海时间(北京时间)世界协调时间(Universal Time Coordinated,UTC)GPS 系统中有两种时间区分&#xff0c;一为UTC&#xff0c;另一为LT&a…