外面了。
解决方案
< div id = " app" >
< table>
< tbody>
< tr is = " row" > tr>
< tr is = " row" > tr>
< tr is = " row" > tr>
< tr is = " row" > tr>
tbody>
table>
div>
< script type = " text/javascript" >
Vue. component ( 'row' , {
template: '这是表格 ' ,
} ) ;
var vm = new Vue ( {
el: '#app' ,
} ) ;
script>
1.1.2 非根组件(子组件)中data
必须是函数,返回一个对象。
子组件不像是根组件只会有一个,既然注册了子组件就是想要复用,为了保证每一个子组件数据的唯一性,避免多个子组件数据共享,通过函数将数据存在到独立的函数作用域中。
< div id = " app" >
< table>
< tbody>
< tr is = " row" > tr>
< tr is = " row" > tr>
< tr is = " row" > tr>
< tr is = " row" > tr>
tbody>
table>
div>
< script type = " text/javascript" >
Vue. component ( 'row' , {
template: "{{num}} " ,
data: function ( ) {
return {
num: 0 ,
} ;
} ,
methods: {
addNum: function ( ) {
this . num++ ;
} ,
}
} ) ;
var vm = new Vue ( {
el: '#app' ,
} ) ;
script>
1.1.3 使用引用ref="引用名"
获取dom元素和组件引用
虽然使用vue我们只需要关心数据,不用操作dom。但是复杂的动画就不要指望vue,还是要使用dom。
1.使用ref获取dom元素
通过在html标签上加ref="xxx"
属性,可通过this.$refs.xxx
取得该dom节点
< div id = " app" >
< div ref = " hello" @click = " getDom" > {{message}} div>
div>
< script type = " text/javascript" >
var vm = new Vue ( {
el: '#app' ,
data: {
message: ' hello poorpenguin' ,
} ,
methods: {
getDom: function ( ) {
console. log ( this . $refs. hello) ;
}
}
} ) ;
script>
2.使用ref获取组件引用
在组件 上添加了ref属性,可以取得的是该组件的引用(也可以理解为该组件对象),因此可以访问该组件上的属性
这只是举个例子,并不推荐这样写
< div id = " app" >
< row ref = " numOne" @numchange = " changeTotal" > row>
+
< row ref = " numTwo" @numchange = " changeTotal" > row>
= {{total}}
div>
< script type = " text/javascript" >
Vue. component ( 'row' , {
template: '{{number}} ' ,
data: function ( ) {
return {
number: 0 ,
} ;
} ,
methods: {
addNum: function ( ) {
this . number++ ;
this . $emit ( 'numchange' ) ;
}
}
} ) ;
var vm = new Vue ( {
el: '#app' ,
data: {
total: 0 ,
} ,
methods: {
changeTotal: function ( ) {
this . total = this . $refs. numOne. number + this . $refs. numTwo. number;
}
}
} ) ;
script>
两个组件对象。
1.1.4 子组件的单个根元素
当子组件的模板template
中有多个dom元素的时候,要使用一个元素将他们包裹起来。每个组件必须只有一个根元素,所有要将模板的内容包裹在一个父元素内。
模板中这样写是会报错的。
var counter = {
props: [ 'count' ] ,
template: '123123 poorpenguin {{count}}
' ,
} ;
这样式正确的写法
var counter = {
props: [ 'count' ] ,
template: '123123 poorpenguin {{count}}
' ,
} ;
1.2 父子组件间的数据传递
1.2.1 父组件传值给子组件
父组件通过 属性形式 传值给子组件(不一定要使用v-bind
将属性和根组件中的变量绑定)
不使用指令v-bind
,直接使用属性进行传值。但是这样" "
中的就不是js表达式,子组件接收到的就是字符串
< div id = " app" >
< counter count = " 3" > counter>
div>
< script type = " text/javascript" >
var counter = {
props: [ 'count' ] ,
template: '{{count}}
' ,
} ;
var vm = new Vue ( {
el: '#app' ,
components: {
'counter' : counter,
}
} ) ;
script>
使用指令v-bind
,就可以将属性和根组件中的变量进行绑定,这时" "
中就是js表达式,也可以直接传递数字。
< div id = " app" >
< counter :count = " num1" > counter> 这里使用v-bind命令
或者< counter :count = " 3" > counter> 这样传递的也是数字,而不是字符串
div>
< script type = " text/javascript" >
var counter = {
props: [ 'count' ] ,
template: '{{count}}
' ,
} ;
var vm = new Vue ( {
el: '#app' ,
data: {
num1: 3 ,
} ,
components: {
'counter' : counter,
}
} ) ;
script>
子组件通过props[]
接收传递过来的属性,但是不能直接操作接收的属性 。
子组件通过props[]
接收传递过来的属性,并将传递过来的属性赋值给在data
中定义新属性。 因为单项数据流,修改Object的值会导致别的引用了该对象的子组件内数据的变化,用在子组件内复制一份该对象,修改子组件内自己的data来代替。
< div id = " app" >
< counter :count = " num1" > counter>
div>
< script type = " text/javascript" >
var counter = {
props: [ 'count' ] ,
data: function ( ) {
return {
number: this . count,
} ;
} ,
template: '{{number}}
' ,
methods: {
addNum: function ( ) {
this . number++
} ,
}
} ;
var vm = new Vue ( {
el: '#app' ,
data: {
num1: 3 ,
} ,
components: {
'counter' : counter,
}
} ) ;
script>
错误示范:
子组件
var counter = {
props: [ 'count' ] ,
template: '{{count}}
' ,
methods: {
addNum: function ( ) {
this . count++
} ,
}
} ;
1.2.2 子组件传值给父组件
子组件事件触发的形式this.$emit("自定义事件名","传给父组件的数据"),
向父组件传值
var counter = {
props: [ 'count' ] ,
data: function ( ) {
return {
number: this . count,
} ;
} ,
template: '{{number}}
' ,
methods: {
addNum: function ( ) {
this . number++
this . $emit ( 'numchange' , this . number) ;
} ,
}
} ;
父组件通过@自定义事件名="父组件的方法“
监听子组件传值
< div id = " app" >
< counter :count = " num1" @numchange = " show" > counter> 监听子组件的事件
div>
< script type = " text/javascript" >
var counter = {
props: [ 'count' ] ,
data: function ( ) {
return {
number: this . count,
} ;
} ,
template: '{{number}}
' ,
methods: {
addNum: function ( ) {
this . number++
this . $emit ( 'numchange' , this . number, '阿西吧' ) ;
} ,
}
} ;
var vm = new Vue ( {
el: '#app' ,
data: {
num1: 3 ,
} ,
components: {
'counter' : counter,
} ,
methods: {
show: function ( value, str) { 接收子组件的传值
console. log ( value, str) ;
} ,
}
} ) ;
script>
1.3 组件参数校验与非 props 特性
1.3.1 组件参数校验
1.3.2 非props特性
props 特性 :父组件向子组件传递一个属性,子组件通过 props 声明了相应属性进行接收,在 DOM 中不会显示该属性。
< div id = " app" >
< my-component title = " 标题1" content = " hello poorpenguin" > my-component>
div>
< script type = " text/javascript" >
Vue. component ( 'my-component' , {
props: [ 'content' , 'title' ] ,
template: `` ,
} ) ;
var vm = new Vue ( {
el: '#app' ,
} ) ;
script>
非props特性 :父组件向子组件传递一个属性,子组件没有通过 props 声明相应属性进行接收: 1、子组件中是无法使用父组件传递过来的值 2、该属性会显示在子组件模板中的根元素上
< div id = " app" >
< my-component title = " 标题1" content = " hello poorpenguin" > my-component>
div>
< script type = " text/javascript" >
Vue. component ( 'my-component' , {
template: `` ,
} ) ;
var vm = new Vue ( {
el: '#app' ,
} ) ;
script>
1.4 自定义组件绑定原生事件
什么是原生事件
在dom元素上绑定的事件就是原生事件
在子组件(自定义组件)的模板template
中dom元素绑定的也是原生事件。
< div id = " app" >
< my-component title = " 标题1" content = " hello poorpenguin" > my-component>
< div @click = " clickDiv" > div>
div>
< script type = " text/javascript" >
Vue. component ( 'my-component' , {
template: `` ,
methods: {
clickDiv: function ( ) {
alert ( '这是子组件中原生事件' ) ;
}
}
} ) ;
var vm = new Vue ( {
el: '#app' ,
methods: {
clickDiv: function ( ) {
alert ( '这是原生事件' ) ;
}
}
} ) ;
script>
什么是自定义事件
< div id = " app" >
< my-component title = " 标题1" content = " hello poorpenguin" @click = " show" > my-component>
< div @click = " clickDiv" > div>
div>
....
如果需要在自定义的组件上直接实现@click事件需要使用@click.native监听原生点击事件。
< my-component @click.native = " handleClick" > my-component>
div>
< script type = " text/javascript" >
Vue. component ( 'my-component' , {
template: `` ,
} ) ;
var vm = new Vue ( {
el: '#app' ,
methods: {
handleClick: function ( ) {
alert ( '自定义事件' ) ;
}
}
} ) ;
script>
1.4.1 在路由
上绑定原生事件
在router-link上直接绑定点击事件是不起作用的,需要使用.native修饰符才能绑定原生事件
< router-link to = " /" tag = " div" class = " header-abs" v-show = " isShow" @click.native = " removeScrollListener" >
< i class = " iconfont" > i>
router-link>
1.5 非父子组件间的传值
一个网页可以拆分成多个组件,根组件下有多个子组件,每一个子组件下也有许多子组件。
父子组件 ,就是具备父子关系的组件(如下图1和2
就是父子组件)
非父子组件 ,就是两个组件传值,但是两个组件不具备父子关系。(如下图的1和3
、3和3
就是分父子组件)
解决非父子组件间的传值,有两个解决方案
使用Vuex
利用vue的总线机制。
1.5.1 利用bus
(总线机制/发布订阅模式/观察者模式)解决非父子组件间传值问题
前面强调过,每一个组件都是一个Vue实例,如果在Vue的原型prototype
上定义一个属性,那后续实例化出来的根组件还是子组件都会有这个属性。
利用bus解决的三步骤:
在Vue的prototype上定义bus属性 Vue.prototype.bus = new Vue();
在组件的mounted生命周期钩子 里使用this.bus.$on(‘事件名’, function(value){});来监听所定义的bus属性上对应的事件被触发,然后在回调函数里进行操作。
在组件的methods定义的方法里使用 this.bus.$emit(‘事件名’, value); 触发事件并传值。
兄弟组件间的值传递:
< div id = " app" >
< child content = " poor" > child>
< child content = " penguin" > child>
div>
< script type = " text/javascript" >
Vue. prototype. bus = new Vue ( ) ;
Vue. component ( 'child' , {
props: {
content: String,
} ,
template: '{{selfContent}}
' ,
data: function ( ) {
return {
selfContent: this . content,
} ;
} ,
mounted: function ( ) {
var this_ = this ;
this . bus. $on ( 'childchange' , function ( value) {
this_. selfContent = value;
} ) ;
} ,
methods: {
handleClick: function ( ) {
this . bus. $emit ( 'childchange' , this . selfContent) ;
} ,
}
} ) ;
var vm = new Vue ( {
el: '#app' ,
} ) ;
script>
1.6 Vue中使用插槽
1.6.1 插槽
的作用
插槽在Vue中很重要,如果想要父组件向子组件传递dom元素
,子组件在模板template
展现传递过来的dom元素
,就需要用来插槽。
父组件使用属性传递dom元素
有人会说可以使用属性传递dom元素啊
。
< div id = " app" >
< child content = " poorpenguin " > child>
div>
< script type = " text/javascript" >
var child = {
props: [ 'content' ] ,
template: `` ,
} ;
var vm = new Vue ( {
el: '#app' ,
components: {
'child' : child,
}
} ) ;
script>
可以发现HTML标签并没有被解析。 那使用v-html
命令
template: `` ,
虽然HTML标签被解析了,但是外面又包裹了一层,
别想了没用。>
使用插槽就可以很好的解决问题。
1.6.2 插槽
基本用法
在父组件中的自定义组件中直接插入dom元素
在子组件的template
中使用
占位,在渲染后占位的
会被替换成dom元素。
< div id = " app" >
< child>
< h1> poorpenguin h1> **插槽的内容
child>
div>
< script type = " text/javascript" >
var child = {
props: [ 'content' ] ,
template: `` ,
} ;
var vm = new Vue ( {
el: '#app' ,
components: {
'child' : child,
}
} ) ;
script>
成功插入
多个
重复渲染的问题
这样说并不准确,下面例子说明问题。
< div id = " app" >
< child>
< div> 这是头headler div>
< div> 这是脚footer div>
child>
div>
< script type = " text/javascript" >
var child = {
props: [ 'content' ] ,
template: `` ,
} ;
var vm = new Vue ( {
el: '#app' ,
components: {
'child' : child,
}
} ) ;
script>
使用具名插槽解决
重复渲染的问题
1.6.3 具名插槽
具名插槽就是给插槽取名
,给要要传递的内容指定插槽
。
< div id = " app" >
< child>
< div slot = " header" > 这是头headler div>
< div slot = " footer" > 这是脚footer div>
child>
div>
< script type = " text/javascript" >
var child = {
props: [ 'content' ] ,
template: `` ,
} ;
var vm = new Vue ( {
el: '#app' ,
components: {
'child' : child,
}
} ) ;
script>
1.6.4 插槽定义默认值
用法
插槽默认内容
例子:
< div id = " app" >
< child>
< div slot = " footer" > 这是脚footer div>
child>
div>
< script type = " text/javascript" >
var child = {
props: [ 'content' ] ,
template: `` ,
} ;
var vm = new Vue ( {
el: '#app' ,
components: {
'child' : child,
}
} ) ;
script>
1.6.5 作用域插槽
作用域插槽的使用场景:
子组件循环中要循环的模板是由父组件决定的时候。(也就是同一个组件在不同地方使用,需要展现不同的样子)
作用域插槽必须用包裹,同时 必须定义slot-scope=‘props’来接受子组件传来插槽的值
< div id = " app" >
< child>
< template slot = " content" slot-scope = " props" >
< h2> {{props.item}} h2>
template>
child>
div>
< script type = " text/javascript" >
var child = {
props: [ 'content' ] ,
data: function ( ) {
return {
list : [ '某一发' , '某宣告' , '某本伟' , '某天佑' , '某糯米' ] ,
} ;
} ,
template: `
以下是被和谐名单
` ,
} ;
var vm = new Vue ( {
el: '#app' ,
components: {
'child' : child,
}
} ) ;
script>
1.7 动态组件
动态组件
使用is属性指定加载哪一个组件使用。
和v-if
类似,没有被加载的组件是会被销毁 的。
每一次组件的切换都是创建 和销毁
< div id = " app" >
< component :is = " type" > component>
< button @click = " handleBtnClick" > change button>
div>
< script type = " text/javascript" >
Vue. component ( 'child-one' , {
template: 'child-one ' ,
} ) ;
Vue. component ( 'child-two' , {
template: 'child-two ' ,
} ) ;
var vm = new Vue ( {
el: '#app' ,
data: {
type: 'child-one' ,
} ,
methods: {
handleBtnClick: function ( ) {
this . type = this . type === 'child-one' ? 'child-two' : 'child-one' ;
}
}
} ) ;
script>
在子组件的根元素上使用v-once
指令,可以提升效率
Vue. component ( 'child-one' , {
template: 'child-one ' ,
} ) ;
Vue. component ( 'child-two' , {
template: 'child-two ' ,
} ) ;
这样每一次在切换的时候,之前的内容会被保存在内存中,而不会被销毁。
二、Vue中的动画特效
在以下的情况可以使用
动画特效
条件渲染 (使用 v-if)
条件展示 (使用 v-show)
动态组件
组件根节点
2.1 Vue动画或过渡原理
vue中的css动画是通过在某一时刻 自动的给元素标签上增加相应css样式 来实现的。
设置过渡或动画的步骤
将要实现动画效果的 DOM 节点用 transition 标签包裹起来,可添加 name 属性;若没有 name 属性,则默认的 class 前缀为 v。
< transition name = " fade" >
< h1 v-if = " show" > Hello poorpenguin h1>
transition>
定义过渡类名
元素进入是的执行过程 在元素显示的瞬间(第1帧 的时候),会向目标元素上添加两个classfade-enter
和fade-enter-active
;执行到 第2帧 的时候,会去掉fade-enter
,添加fade-enter-to
;到动画 结束前1帧 的时候,去掉fade-enter-active
和fade-enter-to
,元素保持原始状态。 1 fade-enter:定义元素进入过渡第1帧的状态,在第2帧被移除。 2 fadel-enter-active:定义元素整个过渡的过渡时间,延时和曲线函数,其实就是transition: all .5s ease;
这个样子,在动画结束前1帧被移除。 3 fade-enter-to:定义元素在动画结束前1帧的状态,在第2帧添加,在动画结束前1帧被移除。一般都不写 ,让动画默认过渡到元素的原始状态。
元素离开时的执行过程 1 fade-leave:定义元素离开时第1帧的状态,一般都不写 ,默认从元素初始状态过渡。 2 fade-leave-active:… 3 fade-leave-to:定义动画结束前1帧的状态,这个是必须要写的。
< style>
.fade-enter {
transform : translateX ( 50px) ;
opacity : 0;
}
.fade-enter-active,
.fade-leave-active {
transition : all 3s ease;
}
.fade-leave-to {
transform : translateX ( 50px) ;
opacity : 0;
}
style>
如果没有给
添加name
属性,则css样式名可以v-
的前缀,不过不建议这样做。
< style>
.v-enter {
transform : translateX ( 50px) ;
opacity : 0;
}
.v-enter-active,
.v-leave-active {
transition : all 3s ease;
}
.v-leave-to {
transform : translateX ( 50px) ;
opacity : 0;
}
style>
....
< transition>
< h1 v-if = " show" > Hello poorpenguin h1>
transition>
案例1:
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< script type = " text/javascript" src = " ./vue.js" > script>
< style>
.fade-enter {
transform : translateX ( 50px) ;
opacity : 0;
}
.fade-enter-active,
.fade-leave-active {
transition : all 3s ease;
}
.fade-leave-to {
transform : translateX ( 50px) ;
opacity : 0;
}
style>
head>
< body>
< div id = " app" >
< transition name = " fade" >
< h1 v-if = " show" > Hello poorpenguin h1>
transition>
< button @click = " handleBtnClick" > {{btnText}} button>
div>
< script type = " text/javascript" >
var vm = new Vue ( {
el: '#app' ,
data: {
show: true ,
btnText: '显示' ,
} ,
methods: {
handleBtnClick: function ( ) {
this . show = ! this . show;
this . btnText = this . btnText === '显示' ? '隐藏' : '显示' ;
} ,
}
} ) ;
script>
body>
html)>
2.2 在vue中使用动画 关键帧@keyframes
对css3动画不是很了解的请看 CSS3 基础(7)—— CSS3动画(animation)
通过2.1的原理我们知道在过渡类名中v-enter-active
和v-enter-active
这两个class在元素执行过渡或动画的过程中一直存在。所以我们可以省略除了v-enter-active
和v-enter-active
外其他class,使用关键帧@keyframes
来控制元素动画的初始和结束状态 。
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< script type = " text/javascript" src = " ./vue.js" > script>
< style>
@keyframes fade{
0% {
opacity : 0;
transform : translateX ( 50px) ;
}
100% {
opacity : 1;
}
}
.fade-enter-active {
animation : fade 3s;
}
.fade-leave-active {
animation : fade 3s reverse;
}
style>
head>
< body>
< div id = " app" >
< transition name = " fade" >
< h1 v-if = " show" > Hello poorpenguin h1>
transition>
< button @click = " handleBtnClick" > {{btnText}} button>
div>
< script type = " text/javascript" >
var vm = new Vue ( {
el: '#app' ,
data: {
show: true ,
btnText: '显示' ,
} ,
methods: {
handleBtnClick: function ( ) {
this . show = ! this . show;
this . btnText = this . btnText === '显示' ? '隐藏' : '显示' ;
} ,
}
} ) ;
script>
body>
html>
2.3 利用自定义过渡类名使用第三方动画库animate.css
2.3.1 自定义过渡类名
通过在transition
标签中加上
='..'
来使用自定义的过渡类名。 例子:
< style>
@keyframes fade{
0% {
opacity : 0;
transform : translateX ( 50px) ;
}
100% {
opacity : 1;
}
}
.show {
animation : fade 3s;
}
.hide {
animation : fade 3s reverse;
}
style>
< div id = " app" >
//使用自定义的过渡类名
< transition
enter-active-class = " show"
leave-active-class = " hide"
>
< h1 v-if = " show" > Hello poorpenguin h1>
transition>
< button @click = " handleBtnClick" > {{btnText}} button>
div>
< script type = " text/javascript" >
var vm = new Vue ( {
el: '#app' ,
data: {
show: true ,
btnText: '显示' ,
} ,
methods: {
handleBtnClick: function ( ) {
this . show = ! this . show;
this . btnText = this . btnText === '显示' ? '隐藏' : '显示' ;
} ,
}
} ) ;
script>
2.3.2 使用第三方动画库animate.css
animate.css官网
使用步骤
使用 link 来引用animate.css
只需要在
就行
ps:注意这里使用的是动画,只需要使用enter-active-class
和leave-active-class
就行,如果是使用过渡那就需要其他的过渡类名了
< link rel = " stylesheet" type = " text/css" href = " ./animate.css" >
< div id = " app" >
< transition
enter-active-class = " animated bounceInDown"
leave-active-class = " animated bounceOutDown"
>
< h1 v-if = " show" > Hello poorpenguin h1>
transition>
< button @click = " handleBtnClick" > {{btnText}} button>
div>
< script type = " text/javascript" >
var vm = new Vue ( {
el: '#app' ,
data: {
show: true ,
btnText: '显示' ,
} ,
methods: {
handleBtnClick: function ( ) {
this . show = ! this . show;
this . btnText = this . btnText === '显示' ? '隐藏' : '显示' ;
} ,
}
} ) ;
script>
2.4 解决第一次刷新页面没有动画的问题
使用appear
和appear-active
解决。 使用2.3的例子
< transition
appear
appear-active-class = " animated bounceInDown"
enter-active-class = " animated bounceInDown"
leave-active-class = " animated bounceOutDown"
>
< h1 v-if = " show" > Hello poorpenguin h1>
transition>
这样第一次进入(刷新页面)就有动画效果了。
2.5 在vue中同时使用过渡和动画
想要同时使用过渡和动画,只需要过渡和动画的两种方法相结合就行。
< style>
.fade-enter,
.fade-leave-to {
opacity : 0;
}
.fade-enter-active,
.fade-leave-active {
transition : opacity 3s;
}
style>
< transition
name = " fade"
appear
appear-active-class = " animated swing fade-enter-active"
enter-active-class = " animated swing fade-enter-active"
leave-active-class = " animated shake fade-leave-active"
>
< h1 v-if = " show" > Hello poorpenguin h1>
transition>
2.5.1 使用type
使过渡和动画同时结束
.同时存在过渡动画和其他动画,但时长不一样时,可以设置type属性来决定以谁为准,如: type="transition"
则以过渡的时长为准,type="animation"
以动画时长为准
< transition
type = " transition"
name = " fade"
appear
appear-active-class = " animated swing fade-enter-active"
enter-active-class = " animated swing fade-enter-active"
leave-active-class = " animated shake fade-leave-active"
>
< h1 v-if = " show" > Hello poorpenguin h1>
transition>
2.5.2 自定义时长:duration
当要自定义时长时可以这样, :duration=“3000” 以毫秒计,这样的话不会以动画时长为准,而是自己定义的时长;更复杂点可以设置入场和出场动画时长,:duration="{enter:5000, leave:10000}"
2.6 Vue中的 Js 动画和使用第三方js动画库Velocity.js
2.6.1 Vue中的JS动画
js动画是通过绑定在
上的钩子函数完成的。
< transition
@before-appear 都是第一次打开页面(刷新)
@appear
@after-appear
@before-enter = " beforeEnter" 进入动画前执行
@enter = " enter" 进入动画时执行
@after-enter = " afterEnter" 进入动画完成后,在enter中调用done()告诉vue,js动画结束才会触发
@before-leave = " beforeLeave"
@leave = " leave"
@after-leave = " afterLeave"
>
transition>
在定义的方法中都会接收到一个参数
methods: {
beforeEnter: function ( el) {
el. style. color= 'red' ;
}
enter: function ( el, done) {
done ( ) ; 只有调用这个回调函数,Vue才知道动画执行结束
}
afterEnter: function ( el) {
}
}
例子1:
< div id = " app" >
< h1 v-if = " show" > Hello poorpenguin h1>
transition>
< button @click = " handleBtnClick" > {{btnText}} button>
div>
< script type = " text/javascript" >
var vm = new Vue ( {
el: '#app' ,
data: {
show: true ,
btnText: '显示' ,
} ,
methods: {
beforeEnter: function ( el) {
el. style. color= 'red' ;
} ,
enter: function ( el, done) {
setTimeout ( function ( ) {
el. style. color= 'blue' ;
} , 2000 ) ;
setTimeout ( function ( ) {
done ( ) ;
} , 4000 ) ;
} ,
afterEnter: function ( el) {
el. style. color= 'black' ;
} ,
handleBtnClick: function ( ) {
this . show = ! this . show;
this . btnText = this . btnText === '显示' ? '隐藏' : '显示' ;
} ,
}
} ) ;
script>
2.6.2 使用第三方js动画库Velocity.js
Velocity.js
自称比jQuery动画和CSS-transitions以及CSS3 animation性能更好的JavaScript动画库。 velocity官网 velocity中文文档 使用Velocity.js可以实现参数和Vue中变量双向绑定,可以实现许多复杂的动画
2.7 Vue中的多个元素或组件过渡
vue的dom元素复用机制 ,可能会导致动画无法执行。元素添加唯一的key
值来使vue对该元素不进行复用
先进入再隐藏和先隐藏再进入,可在元素上设置: mode=“in-out” 或mode=“out-in”
2.7.1 Vue中的多个元素过渡
例子1:
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< script type = " text/javascript" src = " ./vue.js" > script>
< style type = " text/css" >
.fade-enter,
.fade-leave-to {
opacity : 0;
}
.fade-enter {
transform : translateX ( -50px) ;
}
.fade-leave-to {
transform : translateX ( 50px) ;
}
.fade-enter-active,
.fade-leave-active {
transition : all 3s ease;
}
style>
head>
< body>
< div id = " app" >
< transition name = " fade" >
< div v-if = " show" key = " hello" > Hello porpenguin div>
< div v-else key = " bye" > bye poorpenguin div>
transition>
< button @click = " changeDiv" > change button>
div>
< script type = " text/javascript" >
var vm = new Vue ( {
el: '#app' ,
data: {
show: true ,
} ,
methods: {
changeDiv: function ( ) {
this . show = ! this . show;
} ,
}
} ) ;
script>
body>
html>
例子2:
< transition name = " fade" mode = " out-in" >
< div v-if = " show" key = " hello" > Hello porpenguin div>
< div v-else key = " bye" > bye poorpenguin div>
transition>
2.7.2 Vue中多个组件过渡
< transition name = " fade" mode = " out-in" >
< child-one v-if = " show" > Hello porpenguin child-one>
< child-two v-else > bye poorpenguin child-two>
transition>
< style type = " text/css" >
.fade-enter,
.fade-leave-to {
opacity : 0;
}
.fade-enter {
transform : translateX ( -50px) ;
}
.fade-leave-to {
transform : translateX ( 50px) ;
}
.fade-enter-active,
.fade-leave-active {
transition : all 1s ease;
}
style>
< div id = " app" >
< transition name = " fade" mode = " out-in" >
< component :is = " type" > component>
transition>
< button @click = " changeDiv" > change button>
div>
< script type = " text/javascript" >
Vue. component ( 'child-one' , {
template: 'hello poorpenguin
' ,
} ) ;
Vue. component ( 'child-two' , {
template: 'bye poorpenguin
' ,
} ) ;
var vm = new Vue ( {
el: '#app' ,
data: {
type: 'child-one' ,
} ,
methods: {
changeDiv: function ( ) {
this . type = this . type === 'child-one' ? 'child-two' : 'child-one' ;
} ,
}
} ) ;
script>
2.8 Vue中的列表过渡
循环列表建议给每一项都添加key这个特征
,不建议key的值为index
,建议值为每个数据的id。
的原理
< transition-group>
< div v-for"item of list" :key = " item.id" >
{{item.content}}
div>
transition-group>
相当于
< transition>
< div> ..... div>
transition>
< transition>
< div> ..... div>
transition>
< transition>
< div> ..... div>
transition>
每添加一项,都会单独执行一次过渡
例子:
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< script type = " text/javascript" src = " ./vue.js" > script>
< style type = " text/css" >
.fade-enter,
.fade-leave-to {
opacity : 0;
}
.fade-enter {
transform : translateX ( -50px) ;
}
.fade-leave-to {
transform : translateX ( 50px) ;
}
.fade-enter-active,
.fade-leave-active {
transition : all 1s ease;
}
style>
head>
< body>
< div id = " app" >
< transition-group name = " fade" >
< div v-for = " (item,index) of list" :key = " item.id" @click = " deleteItem(index)" >
{{item.content}}
div>
transition-group>
< button @click = " addItem" > 添加 button>
div>
< script type = " text/javascript" >
var count = 0 ;
var vm = new Vue ( {
el: '#app' ,
data: {
list: [ ] ,
} ,
methods: {
addItem: function ( ) {
this . list. push ( {
id: ++ count,
content: 'hello poorpenguin' ,
} ) ;
} ,
deleteItem: function ( index) {
this . list. splice ( index, 1 ) ;
} ,
}
} ) ;
script>
body>
html>
2.9 使用component
和slot
封装动画
写一个组件,里面的模版是
包裹的里面带一个插槽 用这个组件包裹需要动画的节点就可以了 比较推荐动画用js而不是css写,这样可以把动画全部封装在一个组件中。
在 slot 标签上使用 v-show,程序功能是无法实现的,必须要改成v-if。
slot 实际上是一个抽象元素,有点类似 template,本质上并不是一个元素。 而 v-show 是通过控制元素的 display 来进行显示隐藏的,slot 本质上并不是元素,所以压根也就不会有display 这个css属性。 所以,slot 的显示隐藏,得使用 v-if。
带css样式的普通动画封装
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< script type = " text/javascript" src = " ./vue.js" > script>
< style type = " text/css" >
.fade-enter,
.fade-leave-to {
opacity : 0;
}
.fade-enter {
transform : translateX ( -50px) ;
}
.fade-leave-to {
transform : translateX ( 50px) ;
}
.fade-enter-active,
.fade-leave-active {
transition : all 1s ease;
}
style>
head>
< body>
< div id = " app" >
< fade :state = " show" >
< h1> poorpenguin h1>
fade>
< button @click = " changeState" > change button>
div>
< script type = " text/javascript" >
Vue. component ( 'fade' , {
props: [ 'state' ] ,
template: `
` ,
} ) ;
var vm = new Vue ( {
el: '#app' ,
data: {
show: true ,
} ,
methods: {
changeState: function ( ) {
this . show = ! this . show;
} ,
}
} ) ;
script>
body>
html>
推荐使用Vue中的js动画,这样我们可以把动画的js代码都封装进组件中,省略css样式
略
你可能感兴趣的:(前端,Vue)
day15|前端框架学习和算法
universe_01
前端 算法 笔记
T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的
uniapp微信小程序 - 详解微信小程序平台用户授权登录全流程,uniapp v3版本中小程序端开发下用户点击登录后获取手机号/昵称/性别/头像等信息完成登录(提供完整示例代码,一键复制开箱即用)
十一猫咪爱养鱼
前端组件与功能(开箱即用) uniapp常见问题解决 uniapp vue3 uniapp3小程序授权登录 微信小程序登录获取用户信息教程 获取用户昵称手机号头像信息登录 vue3版本小程序平台授权登录 uniap小程序端用户登录流程 uni完整的小程序平台登录源码
效果图在uniapp微信小程序端开发中,超详细实现用户授权登录完整功能源码,用户授权后获取手机号/昵称/头像/性别等,提供完整思路流程及逻辑讲解。uniappVue3和Vue2都能用,你也可以直接复制粘贴,然后改下参数放到你的项目中去就行。整体思路做功能之前,先来看一下整体流程是
vue element 封装表单
影子信息
vue vue.js javascript 前端
背景:在前端系统开发中,系统页面涉及到的表单组件比较多,所以进行了简单的封装。封装的包括一些Form表单组件,如下:input输入框、select下拉框、等实现效果:理论知识:表单组件官方链接:点击跳转封装组件:封装组件的思路:不封装element组件,每一个input组件绑定一个form对象,例如官网。简单封装element组件,利用for循环生成form表单的每一项el-form-item。进
前端面试每日 3+1 —— 第39天
浪子神剑
今天的面试题(2019.05.25)——第39天[html]title与h1、b与strong、i与em的区别分别是什么?[css]写出你知道的CSS水平和垂直居中的方法[js]说说你对模块化的理解[软技能]公钥加密和私钥加密是什么?《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。前端面试每日3+1题,以面试题来驱动学习,每天进步一点!让努力成为一种习惯,让奋斗成为一种享受!欢迎在Iss
大学社团管理系统(11831)
codercode2022
java spring boot spring echarts spring cloud sentinel java-rocketmq
有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项目截图有需要的同学,源代码和配套文档领取,加文章最下方的名片哦!
前端数据库:IndexedDB从基础到高级使用指南
文章目录前端数据库:IndexedDB从基础到高级使用指南引言一、IndexedDB概述1.1什么是IndexedDB1.2与其他存储方案的比较二、基础使用2.1打开/创建数据库2.2基本CRUD操作添加数据读取数据更新数据删除数据三、高级特性3.1复杂查询与游标3.2事务高级用法3.3性能优化技巧四、实战案例:构建离线优先的待办事项应用4.1数据库设计4.2同步策略实现五、常见问题与解决方案5.
【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)
笙囧同学
java 前端 状态模式
核心功能设计用户管理系统用户管理是整个系统的基础,我设计了完整的用户生命周期管理:用户注册流程验证失败验证通过验证失败验证通过用户名已存在用户名可用失败成功用户访问注册页面填写注册信息前端表单验证显示错误提示提交到后端后端数据验证返回错误信息用户名唯一性检查提示用户名重复密码加密处理保存用户信息保存成功?显示系统错误注册成功跳转登录页面登录认证机制深度解析我实现了一套企业级的多层次安全认证机制:认
从零到一:打造基于GigaChat AI的艺术创作平台 | 笙囧同学的全栈开发实战
作者简介:笙囧同学,中科院计算机大模型方向硕士,全栈开发爱好者联系方式:
[email protected] 各大平台账号:笙囧同学座右铭:偷懒是人生进步的阶梯前言在AI技术飞速发展的今天,如何将前沿的大模型技术与实际应用相结合,一直是我们开发者关注的焦点。今天,笙囧同学将带大家从零开始,构建一个基于GigaChatAI的艺术创作平台,实现React前端+Django后端的完整全栈解决方案。这不仅仅是
VUE 座位图功能+扩展
NUZGNAW
vue.js javascript 前端
1、通过循环画出页面座位图0"style="display:table;margin:0auto;min-height:472px;position:relative;">{{i.sign}}2、画出右下角的预览图3、编写对应js方法watch:{seatList:{handler(newVal,oldVal){if(this.seatList&&!stringBlank(this.seatLis
14.tornado操作之应用Websocket协议实现聊天室功能
孤寒者
Tornado框架从入门到实战 websocket tornado 聊天室功能实现 python
目录:每篇前言:1.什么是WebSocket(1)定义(2)优点(3)和HTTP对比(4)适用场景2.WebSocket关键方法3.本tornado项目中使用WebSocket(1)准备一个聊天室的页面:第一步:编写视图:第二步:编写接口:(app.py中加入以下接口!)第三步:编写前端页面:测试接口——响应OK!(2)使用WebSocket:(3)聊天室的聊天功能的最终实现:第一步:战前准备第二
为什么学习Web前端一定要掌握JavaScript?
web前端学习指南
为什么学习Web前端一定要掌握JavaScript?在前端的世界里,没有什么是JavaScript实现不了的,关于JS有一句话:凡是可以用JavaScript来写的应用,最终都会用JavaScript,JavaScript可运行在所有主要平台的所有主流浏览器上,也可运行在每一个主流操作系统的服务器端上。现如今我们在为网站写任何一个主要功能的时候都需要有懂能够用JavaScript写前端的开发人员。
小架构step系列25:错误码
秋千码途
架构 java
1概述一个系统中,可能产生各种各样的错误,对这些错误进行编码。当错误发生时,通过这个错误码就有可能快速判断是什么错误,不一定需要查看代码就可以进行处理,提高问题处理效率。有了统一的错误码,还可以标准化错误信息,方便把错误信息纳入文档管理和对错误信息进行国际化等。没有错误码的管理,开发人员就会按自己的理解处理这些错误。有些直接把堆栈直接反馈到前端页面上,使用看不懂这些信息体验很差,也暴露了堆栈信息有
Java朴实无华按天计划从入门到实战(强化速战版-66天)
岫珩
Java 后端 java 开发语言 学习 Java 时间安排 学习计划
致敬读者感谢阅读笑口常开生日快乐⬛早点睡觉博主相关博主信息博客首页专栏推荐活动信息文章目录Java朴实无华按天计划从入门到实战(强化速战版-66天)1.基础(18)1.1JavaSE核心(5天)1.2数据库与SQL(5天)1.3前端基础(8天)2.进阶(17天)2.1JavaWeb核心(5天)2.2Mybatis与Spring全家桶(6天)2.3中间件入门(4天)2.4实践项目(2天)3.高阶(1
《跨域资源共享CORS的深层逻辑与前端实践精要》
不同源头的资源交互已成为常态,而跨域资源共享(CORS)正是支撑这种交互的隐形架构。现代Web安全体系中平衡开放与防护的精妙设计。理解CORS的深层逻辑,不仅能解决实际开发中的跨域难题,更能触及网络安全与资源流通的核心矛盾,为前端工程师构建稳健的应用提供底层认知支撑。跨域资源共享的诞生,源于网络安全与应用发展的必然冲突。浏览器的同源策略,作为早期网络安全的基石,通过限制不同源文档的交互,有效阻挡了
深入了解 Kubernetes(k8s):从概念到实践
目录一、k8s核心概念二、k8s的优势三、k8s架构组件控制平面组件节点组件四、k8s+docker运行前后端分离项目的例子1.准备前端项目2.准备后端项目3.创建k8s部署配置文件4.部署应用到k8s集群在当今云计算和容器化技术飞速发展的时代,Kubernetes(简称k8s)已成为容器编排领域的事实标准。无论是互联网巨头、传统企业还是初创公司,都在广泛采用k8s来管理和部署容器化应用。本文将带
Vue CSR 到 Nuxt 3 SSR 迁移:技术实现与问题解决实录
二倍速播放
前端 vue.js
1.迁移动机与技术选型1.1CSR架构的局限性基于Vue3和Vite构建的客户端渲染(CSR)单页应用(SPA)提供了良好的开发体验和用户交互流畅性。但是其核心局限在于:搜索引擎优化(SEO):初始HTML响应仅包含一个根div元素,实际内容由JavaScript在浏览器端动态生成。虽然主流搜索引擎(如Google)能够执行部分JavaScript,但其抓取效率和稳定性不如直接获取完整HTML。非
vue项目
阿什么名字不会重复呢
vue.js 前端 javascript
vue进行配置创建vue项目vuecreateone//one就是项目名字npmielement-ui--Snpmiaxios--savenpmiecharts--save配置main.jsimportVuefrom'vue'importAppfrom'./App.vue'importrouterfrom'./router'importstorefrom'./store'importElement
开发避坑短篇(7):Vue+window.print()打印实践
帧栈
避坑指南 vue.js 前端 elementui
需求vue项目中如何打印当前页面内容?解决办法使用浏览器原生APIwindow.print(),这是最简单直接的方式,通过调用window.print()方法触发浏览器打印功能。在vue项目中直接调用print()方法即可,无须引入任何插件。如下:functionhandlePrint(){setTimeout(_=>print(),500)}打印页面样式控制可以使用@mediaprint来控制
大厂都在用的前端缓存策略,你掌握了吗?
AI架构全栈开发实战笔记
前端 缓存 ai
大厂都在用的前端缓存策略,你掌握了吗?关键词:前端缓存、HTTP缓存、ServiceWorker、CDN缓存、缓存策略、性能优化、浏览器缓存摘要:本文将深入探讨前端开发中常用的缓存策略,从浏览器缓存到ServiceWorker,从HTTP缓存头到CDN缓存,全面解析大厂都在使用的高效缓存技术。通过生动的比喻和实际代码示例,帮助开发者理解并掌握这些提升Web应用性能的关键技术。背景介绍目的和范围本文
26. 什么是雪碧图,作用和原理了解吗
yqcoder
前端面试-CSS css 前端 html
总结小图合成一张,使用background来使用,减少资源请求一、什么是雪碧图?雪碧图(CSSSprite)是一种前端优化技术,指的是将多个小图标合并成一张大图,通过CSS控制显示其中的某一部分。它常用于网站中图标、按钮等小图较多的场景。二、雪碧图的作用作用说明✅减少HTTP请求次数合并多个图片为一张图,减少请求资源数✅提升页面加载速度尤其在图片较多时效果明显✅避免图片加载闪烁鼠标悬停切换图片时不
H5UI微信小程序前端框架实战指南
ai
本文还有配套的精品资源,点击获取简介:H5UI是一个为微信小程序开发设计的前端框架,基于H5技术,提供简洁高效的组件库。框架集成了丰富的UI元素,如按钮、表格、导航栏等,简化了界面布局和交互的实现。通过安装、引入、使用组件和事件绑定四个步骤,开发者可以轻松构建功能齐全的应用。了解性能优化等注意事项对于高效开发同样重要。1.微信小程序前端开发框架介绍微信小程序概述微信小程序是微信官方推出的一种无需下
Ubuntu安装LAMP
L_h1
测试 ubuntu linux
在安装vim时遇到了一个问题:E:无法获得锁/var/lib/dpkg/lock-frontend-open(11:资源暂时不可用)E:无法获取dpkg前端锁(/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?解决办法:强制解锁sudorm/var/lib/dpkg/lock-frontendsudorm/var/cache/apt/archives/locksud
震惊!DOM变化监控神器MutationObserver,前端开发必知的隐藏武器!
coding随想
JavaScript 前端 javascript html5
一、什么是MutationObserver?如果你是一个前端开发者,一定会遇到这样的场景:页面动态加载内容后,某些操作失效了。比如,你写了一个监听按钮点击的代码,但按钮是通过AJAX动态加载的,你的代码根本无法触发。这个时候,你就需要一个“监控哨兵”——MutationObserver,它能实时监听DOM树的变化,帮你捕获那些“暗中作祟”的节点变动。MutationObserver是HTML5引入
vue2中实现leader-line-vue连线文章对应字符
小莉爱编程
vue bug记录 vue.js 前端 javascript
效果展示通过点击右边的tag,触发连接操作第一步:获取右边tag展示1.右边的tag列表展示,我这边是分为两个list嵌套的数据结构;{"人员":[{
Coze Studio 架构拆解:AI Agent 开发平台项目结构全分析
代码简单说
2025开发必备(限时特惠) 架构 人工智能 Coze Studio 架构 AI Agent 开发平台 全栈 AI 工程化 图解架构
CozeStudio架构拆解:AIAgent开发平台项目结构全分析标签:CozeStudio项目架构、领域驱动设计DDD、全栈开发规范、Hertz框架、前后端协作、云原生容器、前端测试、IDL接口设计、微服务解耦、AI开发平台源码分析在最近研究AIAgent开发平台的过程中,我深入分析了刚刚开源的CozeStudio项目。这套系统是国内少有的开源全栈AI工程化项目,代码整洁、架构先进,特别是它基于
关于前端的性能优化
性能优化主要涵盖了以下四个方面:(tip:仅代表个人总结,如有不当,还希望看到的大佬多多指示)减少网络请求:合并文件、使用CDN、启用缓存。优化资源加载:代码分割、懒加载、图片压缩。提升渲染性能:减少重绘回流、防抖节流、使用WebWorker。监控和迭代:定期使用工具检测性能,持续优化。一、网络层面优化减少HTTP请求合并文件:将多个CSS或JavaScript文件合并成一个,减少请求次数。使用C
【antdv4.0FormItem更新tooltip属性引发的思考】
北京时间2023-10-19,ant-design-vue最近发布了4.0.4-4.0.6的小版本更新,其中4.0.4新增了对Form组件中FormItem的tooltip属性支持,这个功能我觉得在后台管理场景下还是非常实用的,tooltip属性作用于FormItem中的FormItemLabel区域,用来配置提示信息,当用户不确定该行的用处或者不知道填什么内容时,可以作为input里placeh
linux网卡显示未知未托管,linux有线网络显示设备未托管
NetworkManagerNetworkManager是为了使网络配置尽可能简单而开发的网络管理软件包,如果使用DHCP,NetworkManager会替换默认的路由表、从DHCP服务器获取IP地址并根据情况设置域名服务器,NetworkManager的目标是使网络能够开箱即用。NetworkManager由两部分组成:一个以超级用户运行的守护进程(network-manager);一个前端管理
零基础入门uniapp Vue3组合式API版本
鹤早早
uni-app
前言:小程序学习笔记,课程来源up主咸虾米_。仅记录笔记,大家想学习可以去关注他。1.已安装HBuiderX(目前是4.36版本),微信开发者工具(但还没注册小程序码),相关配置OK了。1.16相关架构学习1.pages-index-index.vuebox1box2.layout{border:1pxsolidred;.box1{border:1pxsolidgreen;}.box2{borde
Vue3组合API初体验
DTcode7
Vue实战指南 VUE HTML web vue框架 前端
Vue3组合API初体验基本概念与作用说明示例一:使用ref创建响应式数据示例二:使用reactive创建响应式对象示例三:使用computed计算属性示例四:使用watch监听数据变化示例五:使用provide/inject进行父子组件间通信功能使用思路与实际开发技巧1.何时使用ref与reactive?2.如何在组合式API中保持逻辑的清晰?3.如何处理异步操作?随着Vue3的发布,组合式AP
枚举的构造函数中抛出异常会怎样
bylijinnan
java enum 单例
首先从使用enum实现单例说起。
为什么要用enum来实现单例?
这篇文章(
http://javarevisited.blogspot.sg/2012/07/why-enum-singleton-are-better-in-java.html)阐述了三个理由:
1.enum单例简单、容易,只需几行代码:
public enum Singleton {
INSTANCE;
CMake 教程
aigo
C++
转自:http://xiang.lf.blog.163.com/blog/static/127733322201481114456136/
CMake是一个跨平台的程序构建工具,比如起自己编写Makefile方便很多。
介绍:http://baike.baidu.com/view/1126160.htm
本文件不介绍CMake的基本语法,下面是篇不错的入门教程:
http:
cvc-complex-type.2.3: Element 'beans' cannot have character
Cb123456
spring Webgis
cvc-complex-type.2.3: Element 'beans' cannot have character
Line 33 in XML document from ServletContext resource [/WEB-INF/backend-servlet.xml] is i
jquery实例:随页面滚动条滚动而自动加载内容
120153216
jquery
<script language="javascript">
$(function (){
var i = 4;$(window).bind("scroll", function (event){
//滚动条到网页头部的 高度,兼容ie,ff,chrome
var top = document.documentElement.s
将数据库中的数据转换成dbs文件
何必如此
sql dbs
旗正规则引擎通过数据库配置器(DataBuilder)来管理数据库,无论是Oracle,还是其他主流的数据都支持,操作方式是一样的。旗正规则引擎的数据库配置器是用于编辑数据库结构信息以及管理数据库表数据,并且可以执行SQL 语句,主要功能如下。
1)数据库生成表结构信息:
主要生成数据库配置文件(.conf文
在IBATIS中配置SQL语句的IN方式
357029540
ibatis
在使用IBATIS进行SQL语句配置查询时,我们一定会遇到通过IN查询的地方,在使用IN查询时我们可以有两种方式进行配置参数:String和List。具体使用方式如下:
1.String:定义一个String的参数userIds,把这个参数传入IBATIS的sql配置文件,sql语句就可以这样写:
<select id="getForms" param
Spring3 MVC 笔记(一)
7454103
spring mvc bean REST JSF
自从 MVC 这个概念提出来之后 struts1.X struts2.X jsf 。。。。。
这个view 层的技术一个接一个! 都用过!不敢说哪个绝对的强悍!
要看业务,和整体的设计!
最近公司要求开发个新系统!
Timer与Spring Quartz 定时执行程序
darkranger
spring bean 工作 quartz
有时候需要定时触发某一项任务。其实在jdk1.3,java sdk就通过java.util.Timer提供相应的功能。一个简单的例子说明如何使用,很简单: 1、第一步,我们需要建立一项任务,我们的任务需要继承java.util.TimerTask package com.test; import java.text.SimpleDateFormat; import java.util.Date;
大端小端转换,le32_to_cpu 和cpu_to_le32
aijuans
C语言相关
大端小端转换,le32_to_cpu 和cpu_to_le32 字节序
http://oss.org.cn/kernel-book/ldd3/ch11s04.html
小心不要假设字节序. PC 存储多字节值是低字节为先(小端为先, 因此是小端), 一些高级的平台以另一种方式(大端)
Nginx负载均衡配置实例详解
avords
[导读] 负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦。负载均衡先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可以解 负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦。
负载均衡
先来简单了解一下什么是负载均衡
乱说的
houxinyou
框架 敏捷开发 软件测试
从很久以前,大家就研究框架,开发方法,软件工程,好多!反正我是搞不明白!
这两天看好多人研究敏捷模型,瀑布模型!也没太搞明白.
不过感觉和程序开发语言差不多,
瀑布就是顺序,敏捷就是循环.
瀑布就是需求、分析、设计、编码、测试一步一步走下来。而敏捷就是按摸块或者说迭代做个循环,第个循环中也一样是需求、分析、设计、编码、测试一步一步走下来。
也可以把软件开发理
欣赏的价值——一个小故事
bijian1013
有效辅导 欣赏 欣赏的价值
第一次参加家长会,幼儿园的老师说:"您的儿子有多动症,在板凳上连三分钟都坐不了,你最好带他去医院看一看。" 回家的路上,儿子问她老师都说了些什么,她鼻子一酸,差点流下泪来。因为全班30位小朋友,惟有他表现最差;惟有对他,老师表现出不屑,然而她还在告诉她的儿子:"老师表扬你了,说宝宝原来在板凳上坐不了一分钟,现在能坐三分钟。其他妈妈都非常羡慕妈妈,因为全班只有宝宝
包冲突问题的解决方法
bingyingao
eclipse maven exclusions 包冲突
包冲突是开发过程中很常见的问题:
其表现有:
1.明明在eclipse中能够索引到某个类,运行时却报出找不到类。
2.明明在eclipse中能够索引到某个类的方法,运行时却报出找不到方法。
3.类及方法都有,以正确编译成了.class文件,在本机跑的好好的,发到测试或者正式环境就
抛如下异常:
java.lang.NoClassDefFoundError: Could not in
【Spark七十五】Spark Streaming整合Flume-NG三之接入log4j
bit1129
Stream
先来一段废话:
实际工作中,业务系统的日志基本上是使用Log4j写入到日志文件中的,问题的关键之处在于业务日志的格式混乱,这给对日志文件中的日志进行统计分析带来了极大的困难,或者说,基本上无法进行分析,每个人写日志的习惯不同,导致日志行的格式五花八门,最后只能通过grep来查找特定的关键词缩小范围,但是在集群环境下,每个机器去grep一遍,分析一遍,这个效率如何可想之二,大好光阴都浪费在这上面了
sudoku solver in Haskell
bookjovi
sudoku haskell
这几天没太多的事做,想着用函数式语言来写点实用的程序,像fib和prime之类的就不想提了(就一行代码的事),写什么程序呢?在网上闲逛时发现sudoku游戏,sudoku十几年前就知道了,学生生涯时也想过用C/Java来实现个智能求解,但到最后往往没写成,主要是用C/Java写的话会很麻烦。
现在写程序,本人总是有一种思维惯性,总是想把程序写的更紧凑,更精致,代码行数最少,所以现
java apache ftpClient
bro_feng
java
最近使用apache的ftpclient插件实现ftp下载,遇见几个问题,做如下总结。
1. 上传阻塞,一连串的上传,其中一个就阻塞了,或是用storeFile上传时返回false。查了点资料,说是FTP有主动模式和被动模式。将传出模式修改为被动模式ftp.enterLocalPassiveMode();然后就好了。
看了网上相关介绍,对主动模式和被动模式区别还是比较的模糊,不太了解被动模
读《研磨设计模式》-代码笔记-工厂方法模式
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
package design.pattern;
/*
* 工厂方法模式:使一个类的实例化延迟到子类
* 某次,我在工作不知不觉中就用到了工厂方法模式(称为模板方法模式更恰当。2012-10-29):
* 有很多不同的产品,它
面试记录语
chenyu19891124
招聘
或许真的在一个平台上成长成什么样,都必须靠自己去努力。有了好的平台让自己展示,就该好好努力。今天是自己单独一次去面试别人,感觉有点小紧张,说话有点打结。在面试完后写面试情况表,下笔真的好难,尤其是要对面试人的情况说明真的好难。
今天面试的是自己同事的同事,现在的这个同事要离职了,介绍了我现在这位同事以前的同事来面试。今天这位求职者面试的是配置管理,期初看了简历觉得应该很适合做配置管理,但是今天面
Fire Workflow 1.0正式版终于发布了
comsci
工作 workflow Google
Fire Workflow 是国内另外一款开源工作流,作者是著名的非也同志,哈哈....
官方网站是 http://www.fireflow.org
经过大家努力,Fire Workflow 1.0正式版终于发布了
正式版主要变化:
1、增加IWorkItem.jumpToEx(...)方法,取消了当前环节和目标环节必须在同一条执行线的限制,使得自由流更加自由
2、增加IT
Python向脚本传参
daizj
python 脚本 传参
如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢?
需要模块:sys
参数个数:len(sys.argv)
脚本名: sys.argv[0]
参数1: sys.argv[1]
参数2: sys.argv[
管理用户分组的命令gpasswd
dongwei_6688
passwd
NAME: gpasswd - administer the /etc/group file
SYNOPSIS:
gpasswd group
gpasswd -a user group
gpasswd -d user group
gpasswd -R group
gpasswd -r group
gpasswd [-A user,...] [-M user,...] g
郝斌老师数据结构课程笔记
dcj3sjt126com
数据结构与算法
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
yii2 cgridview加上选择框进行操作
dcj3sjt126com
GridView
页面代码
<?=Html::beginForm(['controller/bulk'],'post');?>
<?=Html::dropDownList('action','',[''=>'Mark selected as: ','c'=>'Confirmed','nc'=>'No Confirmed'],['class'=>'dropdown',])
linux mysql
fypop
linux
enquiry mysql version in centos linux
yum list installed | grep mysql
yum -y remove mysql-libs.x86_64
enquiry mysql version in yum repositoryyum list | grep mysql oryum -y list mysql*
install mysq
Scramble String
hcx2013
String
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.
Below is one possible representation of s1 = "great":
跟我学Shiro目录贴
jinnianshilongnian
跟我学shiro
历经三个月左右时间,《跟我学Shiro》系列教程已经完结,暂时没有需要补充的内容,因此生成PDF版供大家下载。最近项目比较紧,没有时间解答一些疑问,暂时无法回复一些问题,很抱歉,不过可以加群(334194438/348194195)一起讨论问题。
----广告-----------------------------------------------------
nginx日志切割并使用flume-ng收集日志
liyonghui160com
nginx的日志文件没有rotate功能。如果你不处理,日志文件将变得越来越大,还好我们可以写一个nginx日志切割脚本来自动切割日志文件。第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志。在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件。第二步向nginx主
Oracle死锁解决方法
pda158
oracle
select p.spid,c.object_name,b.session_id,b.oracle_username,b.os_user_name from v$process p,v$session a, v$locked_object b,all_objects c where p.addr=a.paddr and a.process=b.process and c.object_id=b.
java之List排序
shiguanghui
list排序
在Java Collection Framework中定义的List实现有Vector,ArrayList和LinkedList。这些集合提供了对对象组的索引访问。他们提供了元素的添加与删除支持。然而,它们并没有内置的元素排序支持。 你能够使用java.util.Collections类中的sort()方法对List元素进行排序。你既可以给方法传递
servlet单例多线程
utopialxw
单例 多线程 servlet
转自http://www.cnblogs.com/yjhrem/articles/3160864.html
和 http://blog.chinaunix.net/uid-7374279-id-3687149.html
Servlet 单例多线程
Servlet如何处理多个请求访问?Servlet容器默认是采用单实例多线程的方式处理多个请求的:1.当web服务器启动的