04input框和列表渲染

先看一段代码:

const obj = {
    title: "帮你做决定",
    subtitle: "把你的命运交给电脑吧!",
    options: ["option1"]
}
const showOptions = (options) => {
    if(options && options.length > 0) {
        return "这些是options"
    }else{
        return "没有options"
    }
}


const template = (
    <div>
        <h1>{obj.title}</h1>
        <p>{obj.subtitle}</p>
        <p>{showOptions(obj.options)}</p>
        <ol>
            <li>礼品1</li>
            <li>礼品2</li>
        </ol>
        <form action="">
            <input type="text" name="option"/>
            <button>新增</button>
        </form>
    </div>
)

const root = document.getElementById("app");
ReactDOM.render(template, root)

在这里插入图片描述
form表单有一个默认的自动提交到服务器的行为,但是我们要提交到数组中,我们先把它取消。

const formSubmit = (e) => {
    e.preventDefault();
    // 阻止默认行为
    console.log(11)
}
const template = (
    <div>
        <h1>{obj.title}</h1>
        <p>{obj.subtitle}</p>
        <p>{showOptions(obj.options)}</p>
        <ol>
            <li>礼品1</li>
            <li>礼品2</li>
        </ol>
        <form action="" onSubmit={formSubmit}>
            <input type="text" name="option"/>
            <button>新增</button>
        </form>
    </div>
)

在这里插入图片描述
默认事件已取消。
代码已写好,都是逻辑代码,没有什么知识点,注意一下key即可。

const obj = {
    title: "帮你做决定",
    subtitle: "把你的命运交给电脑吧!",
    options: []
}
const showOptions = (options) => {
    if(options && options.length > 0) {
        return `这里有${options.length}个英雄`
    }else{
        return "空空如也~"
    }
}

const formSubmit = (e) => {
    e.preventDefault();   // 阻止默认行为
    let option = e.target.elements.option.value;
    if(option) {
        obj.options.push(option);
        e.target.elements.option.value = "";
        render();
    }
}

// 功能: 清空 数组置空
const removeAll = () => {
    console.log(112);
    obj.options = [];
    render();
}
// 功能: 数组中随机选择
const makeDecision = () => {
    // [0, 1) 随机数
    let index = Math.floor(Math.random() * obj.options.length);
    // console.log(index)
    const option = obj.options[index];
    alert(option)
}
// 渲染DOM
const render = () => {
    const template = (
        <div>
            <h1>{obj.title}</h1>
            <p>{obj.subtitle}</p>
            <p>{showOptions(obj.options)}</p>
            <button disabled={obj.options.length == 0} onClick={makeDecision}>幸运英雄</button>
            <button onClick={removeAll}>清空</button>
            {
                // 不可以直接写对象,但是可以写数组 标签 字符 数字 js语法等
                // 数组中 null true false undefined不会显示
                // [1, 2, 3] = {1}, {2}, {3}
                obj.options.map((option, index) => {
                    return <p key={index + "_" + option}>{option}</p>
                    // 需要key值 以防是input标签 不渲染
                })  
            }
            <ol>
                <li>礼品1</li>
                <li>礼品2</li>
            </ol>
            <form action="" onSubmit={formSubmit}>
                <input type="text" name="option"/>
                <button>新增玩家</button>
            </form>
        </div>
    )
    const root = document.getElementById("app");
    ReactDOM.render(template, root)
}
render();

添加功能:
在这里插入图片描述
随机选择功能:
在这里插入图片描述
清空后置空,并不能选择功能:
在这里插入图片描述
有些事件是原生的,有些不是,具体要看文档。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现这个功能,你需要使用腾讯地图提供的JavaScript API,并且结合Vue架的响应式数据更新机制,实现点击输入后异步获取地址列表并显示在下拉中。 以下是一个简单的实现过程: 1. 在Vue组件的mounted生命周期中,使用腾讯地图API加载地图,并创建一个Autocomplete组件用于输入自动完成搜索。 ```javascript mounted() { // 加载地图 const map = new qq.maps.Map(document.getElementById("map"), { center: new qq.maps.LatLng(39.916527, 116.397128), zoom: 13 }); // 创建Autocomplete组件 const autoComplete = new qq.maps.Autocomplete( document.getElementById("search-input") ); } ``` 2. 监听Autocomplete组件的placechanged事件,当用户选择了一个地址时,触发回调函数,将选中的地址保存在Vue组件的data中,并显示在输入中。 ```javascript // 监听Autocomplete组件的placechanged事件 qq.maps.event.addListener(autoComplete, "place_changed", function() { // 获取选中的地址数据 const place = autoComplete.getPlace(); // 更新Vue组件的data this.address = { name: place.name, location: { lat: place.geometry.location.lat(), lng: place.geometry.location.lng() } }; }); ``` 3. 根据用户输入的关键字,使用腾讯地图API的搜索服务,异步获取相关地址列表,并保存在Vue组件的data中,用于显示在下拉中。 ```javascript // 监听输入input事件 onInput(event) { const keyword = event.target.value; // 使用腾讯地图API的搜索服务,异步获取相关地址列表 const searchService = new qq.maps.SearchService({ location: "北京市", complete: results => { // 将搜索结果保存在Vue组件的data中 this.addressList = results.map(result => ({ name: result.name, location: { lat: result.location.lat, lng: result.location.lng } })); } }); searchService.search(keyword); } ``` 4. 在模板中,使用v-model指令绑定输入的值,使用v-for指令循环渲染地址列表。 ```html <template> <div> <input id="search-input" type="text" v-model="keyword" @input="onInput" /> <ul v-if="addressList.length"> <li v-for="(address, index) in addressList" :key="index">{{ address.name }}</li> </ul> </div> </template> ``` 这样,当用户点击输入时,会触发Autocomplete组件的自动完成搜索,当用户输入关键字时,会异步获取相关地址列表并显示在下拉中。用户选择一个地址时,会触发placechanged事件,将选中的地址保存在Vue组件的data中,并显示在输入中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值