tangjinzhou
7 years ago
11 changed files with 246 additions and 51 deletions
@ -0,0 +1,133 @@
|
||||
<script> |
||||
import omit from 'omit.js' |
||||
|
||||
import inputProps from './inputProps' |
||||
|
||||
import calculateNodeHeight from './calculateNodeHeight' |
||||
|
||||
function onNextFrame (cb) { |
||||
if (window.requestAnimationFrame) { |
||||
return window.requestAnimationFrame(cb) |
||||
} |
||||
return window.setTimeout(cb, 1) |
||||
} |
||||
|
||||
function clearNextFrameAction (nextFrameId) { |
||||
if (window.cancelAnimationFrame) { |
||||
window.cancelAnimationFrame(nextFrameId) |
||||
} else { |
||||
window.clearTimeout(nextFrameId) |
||||
} |
||||
} |
||||
function fixControlledValue (value) { |
||||
if (typeof value === 'undefined' || value === null) { |
||||
return '' |
||||
} |
||||
return value |
||||
} |
||||
|
||||
export default { |
||||
name: 'TextArea', |
||||
props: { |
||||
...inputProps, |
||||
autosize: [Object, Boolean], |
||||
}, |
||||
model: { |
||||
prop: 'value', |
||||
event: 'change.value', |
||||
}, |
||||
data () { |
||||
const { value, defaultValue } = this.$props |
||||
return { |
||||
stateValue: fixControlledValue(value === undefined ? defaultValue : value), |
||||
nextFrameActionId: undefined, |
||||
textareaStyles: {}, |
||||
} |
||||
}, |
||||
computed: { |
||||
}, |
||||
watch: { |
||||
value (val) { |
||||
this.stateValue = fixControlledValue(val) |
||||
if (this.nextFrameActionId) { |
||||
clearNextFrameAction(this.nextFrameActionId) |
||||
} |
||||
this.nextFrameActionId = onNextFrame(this.resizeTextarea) |
||||
}, |
||||
}, |
||||
mounted () { |
||||
this.resizeTextarea() |
||||
}, |
||||
methods: { |
||||
handleKeyDown (e) { |
||||
if (e.keyCode === 13) { |
||||
this.$emit('pressEnter', e) |
||||
} |
||||
this.$emit('keydown', e) |
||||
}, |
||||
resizeTextarea () { |
||||
const { autosize } = this.$props |
||||
if (!autosize || !this.$refs.textArea) { |
||||
return |
||||
} |
||||
const minRows = autosize ? autosize.minRows : null |
||||
const maxRows = autosize ? autosize.maxRows : null |
||||
const textareaStyles = calculateNodeHeight(this.$refs.textArea, false, minRows, maxRows) |
||||
this.textareaStyles = textareaStyles |
||||
}, |
||||
|
||||
getTextAreaClassName () { |
||||
const { prefixCls, disabled } = this.$props |
||||
return { |
||||
[prefixCls]: true, |
||||
[`${prefixCls}-disabled`]: disabled, |
||||
} |
||||
}, |
||||
|
||||
handleTextareaChange (e) { |
||||
const { value } = this.$props |
||||
if (value === undefined) { |
||||
this.stateValue = e.target.value |
||||
this.$nextTick(() => { |
||||
this.resizeTextarea() |
||||
}) |
||||
} else { |
||||
this.$forceUpdate() |
||||
this.$emit('change.value', e.target.value) |
||||
this.$emit('change', e) |
||||
} |
||||
}, |
||||
|
||||
focus () { |
||||
this.$refs.textArea.focus() |
||||
}, |
||||
|
||||
blur () { |
||||
this.$refs.textArea.blur() |
||||
}, |
||||
|
||||
}, |
||||
render () { |
||||
const { stateValue, getTextAreaClassName, handleKeyDown, handleTextareaChange, textareaStyles } = this |
||||
const otherProps = omit(this.$props, [ |
||||
'prefixCls', |
||||
'autosize', |
||||
'type', |
||||
]) |
||||
const attrs = { |
||||
attrs: { ...otherProps, ...this.$attrs }, |
||||
} |
||||
return ( |
||||
<textarea |
||||
{...attrs} |
||||
value={stateValue} |
||||
class={getTextAreaClassName()} |
||||
style={textareaStyles} |
||||
onKeydown={handleKeyDown} |
||||
onInput={handleTextareaChange} |
||||
ref='textArea' |
||||
/> |
||||
) |
||||
}, |
||||
} |
||||
</script> |
@ -0,0 +1,16 @@
|
||||
<template> |
||||
<div> |
||||
<AntTextArea placeholder="Autosize height based on content lines" autosize /> |
||||
<div style="margin: 24px 0" /> |
||||
<ant-textArea placeholder="Autosize height with minimum and maximum number of lines" :autosize="{ minRows: 2, maxRows: 6 }" /> |
||||
</div> |
||||
</template> |
||||
<script> |
||||
|
||||
import { Input } from 'antd' |
||||
export default { |
||||
components: { |
||||
AntTextArea: Input.TextArea, |
||||
}, |
||||
} |
||||
</script> |
@ -0,0 +1,21 @@
|
||||
<template> |
||||
<Search |
||||
placeholder="input search text" |
||||
style="width: 200px" |
||||
@search="onSearch" |
||||
/> |
||||
</template> |
||||
<script> |
||||
|
||||
import { Input } from 'antd' |
||||
export default { |
||||
methods: { |
||||
onSearch (value) { |
||||
console.log(value) |
||||
}, |
||||
}, |
||||
components: { |
||||
Search: Input.Search, |
||||
}, |
||||
} |
||||
</script> |
@ -0,0 +1,23 @@
|
||||
<template> |
||||
<div class="example-input"> |
||||
<AntInput size="large" placeholder="large size" /> |
||||
<AntInput placeholder="default size" /> |
||||
<AntInput size="small" placeholder="small size" /> |
||||
</div> |
||||
|
||||
</template> |
||||
<script> |
||||
|
||||
import { Input } from 'antd' |
||||
export default { |
||||
components: { |
||||
AntInput: Input, |
||||
}, |
||||
} |
||||
</script> |
||||
<style> |
||||
.example-input .ant-input { |
||||
width: 200px; |
||||
margin: 0 8px 8px 0; |
||||
} |
||||
</style> |
@ -0,0 +1,12 @@
|
||||
<template> |
||||
<AntTextArea placeholder="Basic usage" :rows="4"/> |
||||
</template> |
||||
<script> |
||||
|
||||
import { Input } from 'antd' |
||||
export default { |
||||
components: { |
||||
AntTextArea: Input.TextArea, |
||||
}, |
||||
} |
||||
</script> |
@ -1,9 +1,9 @@
|
||||
import Input from './Input' |
||||
import Group from './Group' |
||||
import Search from './Search' |
||||
// import TextArea from './TextArea'
|
||||
import TextArea from './TextArea' |
||||
|
||||
Input.Group = Group |
||||
Input.Search = Search |
||||
// Input.TextArea = TextArea
|
||||
Input.TextArea = TextArea |
||||
export default Input |
||||
|
Loading…
Reference in new issue