- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
更新
将“setData({ data })”更改为“setData(data)”并重新启动 iOS 模拟器后解决
原帖
https://www.npmjs.com/package/react-native-draggable-flatlist示例使用类组件,但我更喜欢使用函数组件。下面是我作为功能组件实现的尝试,但我遇到了一个错误(也在下面)。重新排序单个列表项后发生错误,然后列表消失。
功能组件尝试
import React, { useState } from 'react';
import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
import DraggableFlatList from 'react-native-draggable-flatlist';
import ScreenTitle from '../components/ScreenTitle';
import AppScreen from './AppScreen';
function MyMorningScreen(props) {
const [data, setData] = useState([
{
order: 1,
label: 'Start Timeular',
},
{
order: 2,
label: 'Workout',
},
{
order: 3,
label: 'Shower',
},
]);
const renderItem = ({ item, index, drag, isActive }) => (
<TouchableOpacity style={styles.item} onLongPress={drag}>
<Text>{item.label}</Text>
</TouchableOpacity>
);
return (
<AppScreen style={styles.screen}>
<ScreenTitle title="My Morning" />
<View style={{ flex: 1 }}>
<DraggableFlatList
data={data}
renderItem={renderItem}
keyExtractor={(item, index) => index.toString()}
onDragEnd={({ data }) => setData({ data })}
/>
</View>
</AppScreen>
);
}
const styles = StyleSheet.create({
screen: {
flex: 1,
},
});
export default MyMorningScreen;
错误
[Unhandled promise rejection: TypeError: undefined is not a function (near '...this.props.data.forEach...')]
- node_modules/react-native-draggable-flatlist/lib/index.js:192:20 in __generator$argument_1
* http://127.0.0.1:19000/node_modules/expo/AppEntry.bundle?platform=ios&dev=true&hot=false&minify=false:135784:24 in step
* http://127.0.0.1:19000/node_modules/expo/AppEntry.bundle?platform=ios&dev=true&hot=false&minify=false:135686:72 in <unknown>
- node_modules/react-native/node_modules/promise/setimmediate/core.js:45:6 in tryCallTwo
- node_modules/react-native/node_modules/promise/setimmediate/core.js:200:22 in doResolve
- node_modules/react-native/node_modules/promise/setimmediate/core.js:66:11 in Promise
* http://127.0.0.1:19000/node_modules/expo/AppEntry.bundle?platform=ios&dev=true&hot=false&minify=false:135665:35 in <unknown>
- node_modules/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js:15732:12 in commitLifeCycles
- node_modules/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js:18744:22 in commitLayoutEffects
- node_modules/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js:265:4 in invokeGuardedCallbackImpl
- node_modules/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js:476:2 in invokeGuardedCallback
- node_modules/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js:18483:29 in commitRootImpl
* [native code]:null in commitRootImpl
- node_modules/scheduler/cjs/scheduler.development.js:653:23 in unstable_runWithPriority
- node_modules/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js:18317:17 in commitRoot
- node_modules/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js:17697:12 in performSyncWorkOnRoot
* [native code]:null in performSyncWorkOnRoot
- node_modules/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js:5321:31 in runWithPriority$argument_1
- node_modules/scheduler/cjs/scheduler.development.js:653:23 in unstable_runWithPriority
- node_modules/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js:5316:21 in flushSyncCallbackQueueImpl
- node_modules/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js:5304:28 in flushSyncCallbackQueue
- node_modules/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js:17125:30 in scheduleUpdateOnFiber
- node_modules/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js:11003:16 in dispatchAction
* [native code]:null in dispatchAction
* app/screens/MyMorningScreen.js:36:21 in DraggableFlatList.props.onDragEnd
* http://127.0.0.1:19000/node_modules/expo/AppEntry.bundle?platform=ios&dev=true&hot=false&minify=false:136087:19 in <unknown>
- node_modules/react-native-reanimated/src/core/AnimatedCall.js:9:15 in listener
- node_modules/react-native/Libraries/vendor/emitter/EventEmitter.js:189:10 in emit
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:416:4 in __callFunction
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:109:6 in __guard$argument_0
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:364:10 in __guard
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:108:4 in callFunctionReturnFlushedQueue
* [native code]:null in callFunctionReturnFlushedQueue
最佳答案
工作应用程序:Expo Snack
// Try updating state like shown below:
/*.....*/
onDragEnd={({ data }) => setData(data)}
更新了带有复选框实现的完整代码:
import React, { useState } from 'react';
import {
StyleSheet,
Text,
TouchableOpacity,
View,
CheckBox,
} from 'react-native';
import DraggableFlatList from 'react-native-draggable-flatlist';
const initialData = [
{
order: 1,
label: 'Start Timeular',
isCheked: false,
},
{
order: 2,
label: 'Workout',
isCheked: false,
},
{
order: 3,
label: 'Shower',
isCheked: true,
},
];
function MyMorningScreen(props) {
const [data, setData] = useState(initialData);
const renderItem = ({ item, index, drag, isActive }) => (
<View style={styles.item}>
<TouchableOpacity onLongPress={drag}>
<Text>{item?.label}</Text>
</TouchableOpacity>
<CheckBox
value={item.isCheked}
onChange={() => {
handleCheck(item.label);
}}
/>
</View>
);
const handleCheck = (label) => {
let updated = [...data];
updated = updated.map((task, index) => {
if (label === task.label) {
return { ...task, isCheked: !task.isCheked };
}
return task;
});
setData(updated);
};
return (
<View style={styles.screen}>
<View style={{ flex: 1 }}>
<DraggableFlatList
data={data}
renderItem={renderItem}
keyExtractor={(item, index) => index.toString()}
onDragEnd={({ data }) => setData(data)}
/>
</View>
</View>
);
}
const styles = StyleSheet.create({
screen: {
marginTop: 24,
flex: 1,
backgroundColor: '#212121',
},
item: {
backgroundColor: 'white',
marginTop: 10,
padding: 20,
marginHorizontal: 10,
borderRadius: 10,
flexDirection: 'row',
justifyContent: 'space-between',
},
});
export default MyMorningScreen;
关于javascript - 我如何将 react-native-draggable-flatlist 实现为函数组件而不是类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65591640/
更新: See latest updates at the bottom. 原装 我有 flutter Draggable 和 DragTarget 小部件,它们正在工作,但在放置 DragTarge
我有下面的板。有一个覆盖( Stack )的 2 x 10 小部件,一些透明的小部件是 DragTargets在它们之上,相同的宽度和高度有 Draggable . Draggable那些是包含图像的
当前输出 预期输出 正如我们在第一张图片中看到的,可拖动的 ul li 位于可放置区域的右侧。 当我从数据库中获取内容时,我将在可拖动的 ul 中拥有 n 个元素。 但是当我尝试将 height :
对 jquery 有点陌生,我正在使用可拖动和可放置的东西。我有两个可拖动对象和一个可放置对象。我不太清楚如何让它根据我放置的盒子做不同的事情。这是我的 jquery: $(funct
我在拖动列表中有一个项目池,它使用 connectToSortable 选项连接到一个可排序对象。现在我想从这个排序列表中删除一些项目并将它们移回拖动列表。有点像撤消。假设用户将大约 5 个项目移动到
当使用 jQuery UI draggable+sortable 时,draggable 元素在放入 sortable 时会丢失它的 css。这是我的代码,这是一个 js fiddle demo 尝试
我正在使用 jQuery 构建一个座位应用程序。我的 table 周围有椅子,可能有客人坐在椅子上。每个表格都有一个可拖动的包装 div。 table 里面有任意数量的椅子分区。客人可以在任何椅子座位
这是我从 http://jqueryui.com/demos/draggable/ 中获取的代码 jQuery UI Draggable - Default functionalit
我在使用 Vue.js 和 VueDraggable 库时遇到问题 ( https://github.com/SortableJS/Vue.Draggable )这是一个代码示例:
我使用 jQuery UI 制作了一个可拖动对象,并将帮助器选项设置为“克隆”。如果我开始拖动元素,则会创建克隆,并且它会按预期工作,此外,初始元素中应用的类不会传递给克隆。如果我改为使用辅助选项的函
根据 jQuery UI 文档,将 addClasses 选项设置为 false“将阻止将 ui-draggable 类添加到”可拖动元素: http://api.jqueryui.com/dragg
使用 jQuery Draggable 如何限制可拖动对象被拖动 仅在一个方向 ? 即当 axis: 'y' 时只有顶部或只有底部 并且只有在 axis: 'x' 时才向左或仅向右 这意味着如果我想要
我试图包含我的可拖动元素,这样它就不能被拖动到可查看窗口之外,如果用户位于页面顶部,这种方法效果很好,但是如果你向下滚动,那么它就会把一切搞乱. 我该怎么做? $(".chat-wrapper > l
我有几个draggable & droppable我页面上的元素,它们具有 accept 属性。 目前我的代码设置如下: $(".answer." + answer).draggable({
我正在做一个小项目,并且使用 jquery 的 draggable 有一个有趣的遏制问题。 : 基本上,我有两个 div - 顶部和底部。然后,我有第三个 div,它是 .draggable({}),
如何防止用户将元素拖到窗口之外? elm.css({ top : $(window).scrollTop() + ($(window).height() - elm.height())
我有一个问题需要你帮我解决。我有两个这样的列表。 itemA itemB Add Item itemC Add Item 这里的问题是当我将 itemC 拖动到
我有一个 jQuery Draggable() 函数,并且在拖动时基于 if 执行几个其他函数。像这样的事情: $("div.element").draggable({ drag: funct
我有一个可拖动的 div。现在,我希望该 div 粘在浏览器窗口的边框上。这可能吗?或者也许有一些扩展插件可以实现这一点? 最佳答案 由于我无法模仿 jsfiddle 框架中的 window,因此我将
背景 我正在构建一个 meteor 应用程序,在其中保存相应 div 的对象位置和大小。当再次访问此页面时,我重新创建所有 div 并适本地重新填充对象大小和位置。我正在重新填充 div 和相应的对象
我是一名优秀的程序员,十分优秀!