【组件】动态列表展示

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<!--
		1.显示所有todo列表
		2.输入文本,点击按钮显示到列表首位,并清除输入文本
		  -->
		<div id="example1"></div>
		
		
		<script type="text/babel">
		
		// 1.数据保存在那个组件内?
		// 看数据是某个组件需要它(给它),还是某些组件需要(给共同的父组件)
		// 2.需要在子组件中改变父组件的状态
		// 状态在哪个组件,更新状态的行为就应该定义在那个组件
		// 解决:父组件定义函数,传递给子组件,子组件调用
		    //1.定义组件
			class App extends React.Component{
				constructor(props) {
					super(props)
					//初始化状态
					this.state = {
						todos:['哈尔滨','北京','西安']
					}
					this.addTodo = this.addTodo.bind(this)
				}
				addTodo(todo) {
					const {todos} = this.state
					//在列表前端添加
					todos.unshift(todo)
					//更新状态
					this.setState({todos})
				}
				render() {
					const {todos} = this.state
					return(
					    <div>
						    <h1>ToDo List</h1>
							<Add count={todos.length} addTodo={this.addTodo} />
							<List todos={todos} />
						</div>
					)
				}
			}
			
			class Add extends React.Component{
				constructor(props) {
					super(props)
					this.add = this.add.bind(this)
				}
				
				add() {
					//1.读取输入的数据
					const todo = this.todoInput.value.trim()
					//2.检查合法性
					if(!todo) {
						return
					}
					//3.添加
					this.props.addTodo(todo)
					//4.清除输入
					this.todoInput.value = ''
				}
				//<!-- 表单input接受的数据传送给后台this.todoInput参数 -->
				render(){
					return(
					    <div>
							<input type="text" ref={input => this.todoInput=input}/>
							<button onClick={this.add}>add #{this.props.count+1}</button>
						</div>
					)
				}
			}
			
			
			Add.propTypes = {
				count: PropTypes.number.isRequired,
				addTodo: PropTypes.func.isRequired
			}
			
			class List extends React.Component{
				render(){
					const {todos} = this.props
					return(
					   <ul>
							{
								todos.map((todo,index) => {return <li key={index}>{todo}</li>})
							}
					   </ul>
					)
				}
			}
			//2.渲染组件标签
			ReactDOM.render(<App />,document.getElementById('example1'))
		</script>
		
		<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
		<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
		<script src="https://cdn.bootcdn.net/ajax/libs/prop-types/15.7.2/prop-types.js"></script>
		<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
	</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue2.0组件实现动态搜索引擎的实现思路如下: 1. 创建一个搜索框组件,用于接收用户输入的关键字。 2. 创建一个数据列表组件,用于展示搜索结果。 3. 在搜索框组件中,监听用户输入关键字的事件,并在输入框中实时显示用户输入的关键字。 4. 将用户输入的关键字传递给数据列表组件,用于筛选数据列表中符合关键字的数据。 5. 在数据列表组件中,根据传递过来的关键字,筛选出符合条件的数据,并展示在页面上。 6. 如果搜索结果为空,展示提示信息。 7. 可以设置搜索框的debounce,防止频繁请求接口,影响用户体验。 具体实现代码如下: 搜索框组件: ```javascript <template> <div> <input type="text" v-model="keyword" @input="handleInput" /> </div> </template> <script> export default { data() { return { keyword: '' } }, methods: { handleInput() { this.$emit('search', this.keyword) } } } </script> ``` 数据列表组件: ```javascript <template> <div> <ul> <li v-for="item in filteredData" :key="item.id">{{ item.name }}</li> </ul> <div v-if="filteredData.length === 0">暂无数据</div> </div> </template> <script> export default { props: ['data'], data() { return { keyword: '' } }, computed: { filteredData() { return this.data.filter(item => item.name.includes(this.keyword)) } }, methods: { handleSearch(keyword) { this.keyword = keyword } }, mounted() { this.$on('search', this.handleSearch) } } </script> ``` 使用: ```javascript <template> <div> <search-box @search="handleSearch" /> <data-list :data="data" /> </div> </template> <script> import SearchBox from './SearchBox.vue' import DataList from './DataList.vue' export default { components: { SearchBox, DataList }, data() { return { data: [ { id: 1, name: 'apple' }, { id: 2, name: 'banana' }, { id: 3, name: 'cherry' }, { id: 4, name: 'durian' }, { id: 5, name: 'elderberry' } ] } }, methods: { handleSearch(keyword) { // 根据关键字请求接口,获取数据 // ... } } } </script> ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值