React+AntdUi实现《好客租房系统》发布房源08

export default class Rent extends Component {
state = {
// 出租房屋列表
list: []
}
// 获取已发布房源的列表数据
async getHouseList() {
const res = await getUserHouses()
const { status, data } = res
if (status === 200) {
this.setState({
list: data
})
} else {
const { history } = this.props
history.replace('/login')
}
}
componentDidMount() {
this.getHouseList()
}
renderHouseItem() {
const { list } = this.state
const { history } = this.props
// console.log(list, history)
return list.map(item => {
return (
<HouseItem
key={item.houseCode}
onClick={() => {
history.push(`/detail/${item.houseCode}`)
}}
src={BASE_URL + item.houseImg}
title={item.title}
desc={item.desc}
tags={item.tags}
price={item.price}
/>
)
})
}
renderRentList() {
const { list } = this.state
const hasHouses = list.length > 0
if (!hasHouses) {
return (
<NoHouse>
您还没有房源,
<Link to="/rent/add" className={styles.link}>
去发布房源
</Link>
吧~
</NoHouse>
)
}
return <div className={styles.houses}>{this.renderHouseItem()}</div>
}
render() {
const { history } = this.props
return (
<div className={styles.root}>
<NavBar
className={styles.navHeader}
mode="dark"
icon={<Icon type="left" />}
onLeftClick={() => history.go(-1)}
>
房屋管理
</NavBar>
{this.renderRentList()}
</div>
)
}
}
搜索组件
state = {
// 搜索框的值
searchTxt: '',
tipsList: []
}
async componentDidMount () {
// 获取城市ID
const { value } = await getCurrCity()
this.cityId = value
}
// 搜索小区
handlerSearch = (v) => {
v = v.trim()
if (v.length === 0) {
return this.setState({
searchTxt: '',
tipsList: []
})
}
this.setState({
searchTxt: v
}, () => {
this.timer && clearTimeout(this.timer)
this.timer = setTimeout(async () => {
// 获取小区列表
const res = await getCommunity(v, this.cityId)
if (res.status === 200) {
this.setState({
tipsList: res.data
})
}
}, 600)
})
}
// 选择小区回传
selectCom = (item) => {
this.props.history.replace({ pathname: '/rent/add', state: { id: item.community, name: item.communityName } })
}
// 渲染搜索结果列表
renderTips = () => {
const { tipsList } = this.state
return tipsList.map(item => (
<li onClick={() => this.selectCom(item)} key={item.community} className={styles.tip}>
{item.communityName}
</li>
))
}
render () {
const { history } = this.props
const { searchTxt } = this.state
return (
<div className={styles.root}>
{/* 搜索框 */}
<SearchBar
placeholder="请输入小区或地址"
value={searchTxt}
onChange={this.handlerSearch}
showCancelButton={true}
onCancel={() => history.replace('/rent/add')}
/>
{/* 搜索提示列表 */}
<ul className={styles.tips}>{this.renderTips()}</ul>
</div>
)
}
}
添加房源模块
// 获取输入的值
getInputVal = (name, val) => {
console.log(name, val)
this.setState({
[name]: val
})
}
// 选择配套
selPack = (selNames) => {
console.log(selNames);
this.setState({
supporting: selNames.join('|')
})
}
// 获取房屋图片
// files: Object, operationType: string, index: number
getImg = (files, operationType, index) => {
console.log(files, operationType, index)
this.setState({
tempSlides: files
})
}
// 取消编辑,返回上一页
onCancel = () => {
alert('提示', '放弃发布房源?', [
{
text: '放弃',
onPress: async () => this.props.history.go(-1)
},
{
text: '继续编辑'
}
])
}
// 发布房源
addHouse = async () => {
const {
tempSlides,
title,
description,
oriented,
supporting,
price,
roomType,
size,
floor,
community
} = this.state;
// 处理边界
if (!title || !size || !price) {
return Toast.info('请输入房源基本信息!', 1)
}
// 上传图片,获取上传位置
let houseImg;
if (tempSlides.length) {
let fm = new FormData();
tempSlides.forEach((item) => fm.append('file', item.file));
let res = await uploadHouseImgs(fm);
console.log(res)
if (res.status === 200) {
houseImg = res.data.join('|')
} else {
Toast.fail(res.description, 2)
}
}
// 处理其它数据
const otd = {
title,
description,
houseImg,
oriented,
supporting,
price,
roomType,
size,
floor,
community: community.id
};
let ores = await pubHouse(otd)
console.log('form all data:', otd)
if (ores.status === 200) {
Toast.success('发布成功!', 1, () => {
this.props.history.push('/rent')
})
} else {
if (ores.status === 400) {
Toast.info('请重新登录!', 1, () => {
// 传入回跳地址
this.props.history.push('/login', { backUrl: this.props.location.pathname })
})
}
}
}
render() {
const Item = List.Item
const { history } = this.props
const {
community,
price,
size,
roomType,
floor,
oriented,
description,
tempSlides,
title
} = this.state
return (
<div className={styles.root}>
<NavBar
className={styles.navHeader}
icon={<Icon type="left" />}
mode="dark"
onLeftClick={this.onCancel}
>
发布房源
</NavBar>
<List
className={styles.header}
renderHeader={() => '基本信息'}
data-role="rent-list"
>
{/* 选择所在小区 */}
<Item
extra={community.name || '请选择小区名称'}
arrow="horizontal"
onClick={() => history.replace('/rent/search')}
>
小区名称
</Item>
<InputItem placeholder="请输入租金/月" extra="¥/月" type="number" value={price}
onChange={(v) => {
this.getInputVal('price', v)
}}>
租 金
</InputItem>
<InputItem placeholder="请输入建筑面积" extra="㎡" type="number" value={size}
onChange={(v) => {
this.getInputVal('size', v)
}}
>
建筑面积
</InputItem>
<Picker data={roomTypeData} value={[roomType]} cols={1}
onChange={(v) => {
this.getInputVal('roomType', v[0])
}}
>
<Item arrow="horizontal">
户 型
</Item>
</Picker>
<Picker data={floorData} value={[floor]} cols={1}
onChange={(v) => {
this.getInputVal('floor', v[0])
}}
>
<Item arrow="horizontal">所在楼层</Item>
</Picker>
<Picker data={orientedData} value={[oriented]} cols={1}
onChange={(v) => {
this.getInputVal('oriented', v[0])
}}
>
<Item arrow="horizontal">
朝 向
</Item>
</Picker>
</List>
<List
className={styles.title}
renderHeader={() => '房屋标题'}
data-role="rent-list"
>
<InputItem
placeholder="请输入标题(例如:整租 小区名 2室 5000元)"
value={title}
onChange={(v) => {
this.getInputVal('title', v)
}}
/>
</List>
<List
className={styles.pics}
renderHeader={() => '房屋图像'}
data-role="rent-list"
>
<ImagePicker
files={tempSlides}
onChange={this.getImg}
multiple={true}
className={styles.imgpicker}
/>
</List>
<List
className={styles.supporting}
renderHeader={() => '房屋配置'}
data-role="rent-list"
>
<HousePackage select onSelect={this.selPack} />
</List>
<List
className={styles.desc}
renderHeader={() => '房屋描述'}
data-role="rent-list"
>
<TextareaItem
rows={5}
placeholder="请输入房屋描述信息"
autoHeight
value={description}
onChange={(v) => {
this.getInputVal('description', v)
}}
/>
</List>
<Flex className={styles.bottom}>
<Flex.Item className={styles.cancel} onClick={this.onCancel}>
取消
</Flex.Item>
<Flex.Item className={styles.confirm} onClick={this.addHouse}>
提交
</Flex.Item>
</Flex>
</div>
)
}
}

浙公网安备 33010602011771号